主頁 >  其他 > Linux--基礎IO

Linux--基礎IO

2021-04-05 11:36:22 其他

C檔案介面

寫檔案

#include<stdio.h>
#include<string.h>

int main(){
	FILE *fp=fopen("myfile.txt","w");
	if(!fp){
		printf("open error!\n");
		return 1;
	}	
	const char *msg="Hello World!\n";
	//這里不用 +1,具體查看man手冊對該函式得說明
	fwrite(msg,strlen(msg),1,fp);
	
	fclose(fp);
	return 0;	
}

讀檔案

#include<stdio.h>
#include<string.h>

int main(){
  FILE * fp=fopen("myfile.txt","r");
  if(!fp){
    printf("open error!\n");
  }

  char buf[1024];
  ssize_t s=fread(buf,sizeof(char),sizeof(buf),fp);
  if(s>0){
    buf[s]=0;
    printf("%s\n",buf);
    
  }
  fclose(fp);

  return 0;
}

輸出資訊到顯示幕

#include<stdio.h>
#include<string.h>

int main(){

	  const char* msg="hello fwrite!!\n";
		//系統呼叫介面
	  fwrite(msg,sizeof(char),strlen(msg),stdout);
	  //直接向螢屏列印內容
	  printf("hello printf!!\n");
		//C提供的庫函式,向顯示幕中列印
	  fprintf(stdout,"hello fprintf!!\n");
	
	  return 0;
}

stdin & stdout & stderr

C語言會默認打開三個輸入輸出流:1.stdin(標準輸出),2.stdout(標準輸入),3.stderr(標準錯誤),
這三個輸入輸出流都是FILE * 型別,檔案指標型別,

打開檔案方式

	   r      Open  text file for reading.  The stream is positioned at the beginning of the
              file.

       r+     Open for reading and writing.  The stream is positioned at  the  beginning  of
              the file.

       w      Truncate  file  to zero length or create text file for writing.  The stream is
              positioned at the beginning of the file.

       w+     Open for reading and writing.  The file is created if it does not exist,  oth‐
              erwise  it  is  truncated.   The  stream is positioned at the beginning of the
              file.

       a      Open for appending (writing at end of file).  The file is created if  it  does
              not exist.  The stream is positioned at the end of the file.

       a+     Open  for reading and appending (writing at end of file).  The file is created
              if it does not exist.  The initial file position for reading is at the  begin‐
              ning of the file, but output is always appended to the end of the file.

系統檔案I/O

介面(open)介紹

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

pathname: 要打開或創建的目標檔案

flags: 打開檔案時,可以傳入多個引數選項,用下面的一個或者多個常量進行“或”運算,構成flags,

	引數:
		O_RDONLY: 只讀打開
		O_WRONLY: 只寫打開
		O_RDWR : 讀,寫打開
		這三個常量,必須指定一個且只能指定一個
		O_CREAT : 若檔案不存在,則創建它,需要使用mode選項,來指明新檔案的訪問權限
		O_APPEND: 追加寫
	回傳值:
		成功:新打開的檔案描述符
		失敗:-1

write read close lseek ,類比C檔案相關介面

系統呼叫和庫函式

上面的fopen、fclose、fread、fwrite都是C標準庫當中的函式,稱為庫函式(libc),
open、close、read、write、lseek都屬于系統提供的介面,稱為系統呼叫,

看作業系統層次結構圖,我們就對系統呼叫介面和庫函式清楚明了,我們可以認為C標準庫當中的函式(f#系列)都是對系統呼叫介面的封裝,方便二次開發,

在這里插入圖片描述

open回傳值

檔案描述符 fd

通過對open函式的學習,檔案描述符就是一個小整數,

0 & 1 & 2

Linux行程默認情況下會有3個預設打開的檔案描述符:標準輸出0,標準輸入1,標準錯誤2,
0,1,2對應的硬體設備一般是:鍵盤,顯示幕,顯示幕,

在這里插入圖片描述


檔案描述符就是一個從0開始的小整數,當我們打開檔案時,OS在記憶體中要創建相應的資料結構來描述目標檔案,于是有了file結構體,表示一個已經打開的檔案物件,而行程執行open系統呼叫,所以必須讓行程和檔案關聯起來,每個行程都有一個指標*files,指向一張表files_struct,該表最重要的部分就是一個指標陣列,每個元素都有一個指向打開檔案的指標!所以,本質上,檔案描述符就是該陣列的下標,所以只要拿到檔案描述符,就可以找到對應的檔案,每個struct file中包含了打開檔案的相關內容和一些列的函式指標,這樣只需要讀寫相對應的函式指標就能夠對每個檔案進行讀寫操作,

檔案描述符的分配規則

檔案描述符的分配規則:在files_struct陣列當中,找到當前沒有被使用的最小的一個下標,作為新的檔案描述符,

重定向

#include<stdio.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>

int main(){
  close(1);
  int fd=open("log.txt",O_CREAT | O_WRONLY ,0644);
  
  if(fd<0){
    printf("open error!!\n");
  }
  
  const char* str1="hello world!!: printf";
  
  printf("%s\n",str1);
  
  fflush(stdout);
  
  close(fd);
  return 0;
}

此時我們發現本來應該輸出到顯示幕的內容,輸出到了檔案log.txt當中,其中fd=1,這種現象叫做輸出重定向,常見的重定向有:>、>>、<

本質

在這里插入圖片描述

我們知道對于標準輸出默認打開的是fd=1的檔案描述符,那么當我們關閉標準輸出時,當我們打開檔案log.txt,系統會為log.txt分配最小未使用的檔案描述符,就是我們剛剛關閉的檔案,所以給log.txt分配的檔案描述符就是1,所以這時當我們呼叫printf庫函式時,這時就會往檔案描述符為1的那個檔案里面寫內容,就是我們剛剛打開的那個檔案,這就是重定向,

本質

因為IO相關函式與系統呼叫介面對應,并且庫函式封裝系統呼叫,所以本質上,訪問檔案都是 通過fd來訪問的,
所以可以推斷,C庫函式當中的FILE結構體必定封裝了檔案描述符fd,

實驗代碼

#include<stdio.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>


int main(){
  close(1);
  int fd=open("log.txt",O_CREAT | O_WRONLY ,0644);
  if(fd<0){
    printf("open error!!\n");
  }

  const char* msg="hello world!!\n";
  
  const char* str1="hello world!!: printf";
  
  const char* str2="hello world!!: fprintf";
  
  write(fd,msg,strlen(msg));
  printf("%s\n",str1);

  fprintf(stdout,"%s\n",str2);


  fork();
  fflush(stdout);
  
  close(fd);
  return 0;
}

運行結果

在這里插入圖片描述

我們發現 printf 和 fprintf (庫函式) 都列印了兩次,而write系統呼叫只列印了一次,這是為什么?這肯定和fork有關,

一般C庫函式寫檔案時是全緩沖,而顯示幕是行緩沖,
printf和fprintf庫函式是自帶緩沖區的,當發生重定向時,由輸出資料到顯示幕變為輸出到檔案,所以緩沖方式由行緩沖變為了全緩沖,
而我們放在緩沖區的資料不會立即重繪,甚至fork之后,
但是當我們行程結束時,會統一重繪到檔案,
但是當fork的時候,父子行程會發生寫時拷貝,所以當父行程重繪資料的時候,子行程也有了相同的一份資料,子行程也會重繪,所以也就會產生兩份資料,
write沒有變化,所以沒有所謂的緩沖區,

綜上所述:printf和fprintf這些庫函式會自帶緩沖區,而write系統呼叫沒有帶緩沖區,我們這里所說的都是用戶級緩沖區,其實為了提升整體性能,OS也會提供相關內核級緩沖區,不過不再我們討論范圍之內,那這個緩沖區誰提供呢? printf fprintf 是庫函式, write 是系統呼叫,庫函式在系統呼叫的“上層”, 是對系統呼叫的“封裝”,但是 write 沒有緩沖區,而 printf fwrite 有,足以說明,該緩沖區是二次加上的,由C標準庫提供,

// 在/usr/include/libio.h
struct _IO_FILE {
	int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
	#define _IO_file_flags _flags
	
	//緩沖區相關
	/* The following pointers correspond to the C++ streambuf protocol. */
	/* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
	char* _IO_read_ptr; /* Current read pointer */
	char* _IO_read_end; /* End of get area. */
	char* _IO_read_base; /* Start of putback+get area. */
	char* _IO_write_base; /* Start of put area. */
	char* _IO_write_ptr; /* Current put pointer. */
	char* _IO_write_end; /* End of put area. */
	char* _IO_buf_base; /* Start of reserve area. */
	char* _IO_buf_end; /* End of reserve area. */
	/* The following fields are used to support backing up and undo. */
	char *_IO_save_base; /* Pointer to start of non-current get area. */
	char *_IO_backup_base; /* Pointer to first valid character of backup area */
	char *_IO_save_end; /* Pointer to end of non-current get area. */
	struct _IO_marker *_markers;
	struct _IO_FILE *_chain;
	
	int _fileno; //封裝的檔案描述符,就是fd,對于stdin:_fileno=0,stdout:_fileno=1,stderr:_fileno=2
	#if 0
	int _blksize;
	#else
	int _flags2;
	#endif
	_IO_off_t _old_offset; /* This used to be _offset but it's too small. */
	#define __HAVE_COLUMN /* temporary */
	/* 1+column number of pbase(); 0 is unknown. */
	unsigned short _cur_column;
	signed char _vtable_offset;
	char _shortbuf[1];
	/* char* _save_gptr; char* _save_egptr; */
	_IO_lock_t *_lock;
	#ifdef _IO_USE_OLD_IO_FILE
};

使用dup2系統呼叫實作重定向

#include<unistd.h>

int dup2(int oldfd,int newfd);

//若成功則為非負的描述符,若出錯則為-1

dup2函式復制描述符表表項oldfd到描述符表表項newfd,覆寫描述符表表項newfd以前的內容,若newfd已經打開,dup2會在復制oldfd之前關閉newfd,

dup2(4,1)

呼叫dup2之前,fd=1(標準輸出)對應的檔案A,fd=4對應檔案B,A和B的參考計數都為1,呼叫之后,兩個檔案描述符都指向B;檔案A已經關閉,并且它的檔案表和v-node表表項已經洗掉,檔案B的計數參考已經增加,從此以后,任何寫到標準輸出的資料都被重定向到檔案B,

在這里插入圖片描述

檔案系統

我們使用ls -l 的時候看到的除了檔案名,還看到了檔案元資料,

[root@VM-12-3-centos pengke]# ls -l
total 40
drwxrwxr-x 7 pengke pengke  4096 Mar 26 17:14 BitStudy
-rw-rw-r-- 1 pengke pengke   827 Mar 20 15:05 install.sh
drwxrwxr-x 4 pengke pengke  4096 Mar 30 12:20 Linux
-rwxrwxr-x 1 pengke pengke 21784 Mar 20 20:14 sort
drwxrwxr-x 3 pengke pengke  4096 Mar 26 17:12 test

ls -l 讀取存盤在磁盤上的檔案資訊,然后顯示出來,其實除了這種方式可以讀取出來還可以用命令stat命令讀取檔案的更多資訊,

[root@VM-12-3-centos Linux]# stat Mystring.h 
  File: ‘Mystring.h’
  Size: 2493      	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 793845      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/  pengke)   Gid: ( 1001/  pengke)
Access: 2021-03-28 08:55:36.174026236 +0800
Modify: 2021-03-28 08:55:36.172026228 +0800
Change: 2021-03-28 08:55:36.172026228 +0800
 Birth: -

inode

為了搞清楚inode我們先來看看檔案系統:

在這里插入圖片描述

Linux ext2檔案系統,上圖是磁盤檔案系統圖(內核記憶體映像肯定有所不同),磁盤是典型的塊設備,硬碟磁區被劃分為一個個block,一個block的大小是由格式化的時候確定的,并且不可以更改的,例如mke2fs的-b選項可以設定block大小為1024、2048或4096位元組,而上圖中啟動塊(Boot Block)的大小是確定的,

Block Group:ext2檔案系統會根據磁區的大小劃分為數個Block Group,而每個Block Group都有著相同的結構組成,
超級塊(Super Block):存放檔案系統本身的結構資訊,記錄的資訊主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入資料的時間,最近一次檢驗磁盤的時間等其他檔案系統的相關資訊,Super Block的資訊被破壞,可以說整個檔案系統結構就被破壞了,
GDT(Group Descriptor Table):塊組描述符,描述塊組屬性資訊,
塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個資料塊已經被占用,哪個資料塊沒有被占用,
inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用,
節點表(inode Table):存放檔案屬性 如 檔案大小,所有者,最近修改時間等,
資料區(Data blocks):存放檔案資料,

當我們創建一個檔案是,屬性和資料是怎樣存盤的呢?

[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc

為了說明問題,我們將畫一個簡化圖:

在這里插入圖片描述
由上圖可知:
1、目錄中的block中記錄的是目錄下以及子檔案和子目錄的檔案名和inode的對應,
2、檔案中的block中記錄的是檔案實際存盤的資料,

創建一個新檔案主要有以下四個操作:

1、存盤檔案:內核先找到一個空閑的inode節點(這里是263466),內核記錄檔案資訊,
2、存盤資料:該檔案需要存盤到三個磁盤塊,內核找到三個空閑塊:300、400、600,將內核快取區的資料依次復制到磁盤塊,
3、記錄分配情況:檔案內容按順序300,500,800存放,內核在inode上的磁盤分布區記錄了上述塊串列,
4、添加檔案名到目錄:新的檔案名abc,linux如何在當前的目錄中記錄這個檔案?內核將入口(263466,abc)添加到目錄檔案,檔案名和inode之間的對應關系將檔案名和檔案的內容及屬性連接起來,

軟硬鏈接

在Linux中快捷方式有兩種:硬鏈接和軟鏈接,

硬鏈接

我們知道磁盤上的檔案資訊,是存盤在inode當中的,每個檔案的 inode 號都應該是不一樣的,inode 號就相當于檔案 ID,我們在查找檔案的時候,要先查找 inode 號,才能讀取到檔案的內容,創建硬鏈接就相當于多一個檔案名指向inode,硬鏈接不會建立自己的 inode 索引和 block(資料塊),而是直接指向源檔案的 inode 資訊和 block,所以硬鏈接和源檔案的 inode 號是一致的,

創建一個硬鏈接:

ln filename hardlinkName

在這里插入圖片描述

硬鏈接特點

1、不論是修改源檔案(test 檔案),還是修改硬鏈接檔案(test-hard 檔案),另一個檔案中的資料都會發生改變,

2、不論是洗掉源檔案,還是洗掉硬鏈接檔案,只要還有一個檔案存在,這個檔案都可以被訪問,

3、硬鏈接不會建立新的 inode 資訊,也不會更改 inode 的總數,

4、硬鏈接不能跨檔案系統(磁區)建立,因為在不同的檔案系統中,inode 號是重新計算的,

5、硬鏈接不能鏈接目錄,因為如果給目錄建立硬鏈接,那么不僅目錄本身需要重新建立,目錄下所有的子檔案,包括子目錄中的所有子檔案都需要建立硬鏈接,這對當前的 Linux 來講過于復雜,

軟鏈接

軟鏈接會真正建立自己的 inode 索引和 block,所以軟鏈接和源檔案的 inode 號是不一致的,而且在軟鏈接的 block 中,寫的不是真正的資料,是源檔案的檔案名及 inode 號

創建一個軟鏈接:

ln -s filename softlinkName

在這里插入圖片描述

軟鏈接特點

1、不論是修改源檔案,還是修改軟鏈接檔案,另一個檔案中的資料都會發生改變,

2、 洗掉軟鏈接檔案,源檔案不受影響,而洗掉原檔案,軟鏈接檔案將找不到實際的資料,從而顯示檔案不存在,

3、軟鏈接會新建自己的 inode 資訊和 block,只是在 block 中不存盤實際檔案資料,而存盤的是源檔案的檔案名及 inode 號,

4、軟鏈接可以鏈接目錄、跨磁區,

動靜態庫

1、靜態庫(.a):程式在編譯鏈接的時候把庫的代碼鏈接到可執行檔案中,程式運行的時候將不再需\要靜態庫,可移植性強于動態庫,體積較動態庫大,
2、動態庫(.so):程式在運行的時候才去鏈接動態庫的代碼,多個程式共享使用庫的代碼,
3、一個與動態庫鏈接的可執行檔案僅僅包含它用到的函式入口地址的一個表,而不是外部函式所在目標檔案的整個機器碼,
4、在可執行檔案開始運行以前,外部函式的機器碼由作業系統從磁盤上的該動態庫中復制到記憶體中,這個程序稱為動態鏈接(dynamic linking),
5、動態庫可以在多個程式間共享,所以動態鏈接使得可執行檔案更小,節省了磁盤空間,作業系統采用虛擬記憶體機制允許物理記憶體中的一份動態庫被要用到該庫的所有行程共用,節省了記憶體和磁盤空間,

測驗代碼

//myadd.h
#pragma once 

#include<stdio.h>
int Myadd(int x,int y);

//myadd.c
#include"myadd.h"

int Myadd(int x,int y)
{
	return x+y;
}     

//mysub.h
#pragma once 

#include<stdio.h>
int Mysub(int x,int y);

//mysub.c
#include"mysub.h"

int Mysub(int x,int y)
{
	return x-y;
}             

//mytest.c
#include<stdio.h>

#include"myadd.h"
#include"mysub.h"

int main(){

  int x=20,y=10;
  printf("x + y = %d\n",Myadd(x,y));
  printf("x - y = %d\n",Mysub(x,y));
  printf("Hello World\n");

  return 0;
}
                                                   

生成靜態庫

#生成目標檔案
[root@localhost linux]# gcc -c myadd.c -o myadd.o
[root@localhost linux]# gcc -c mysub.c -o mysub.o

#生成靜態庫
[root@localhost linux]# ar -rc libmymath.a myadd.o mysub.o
# ar是gnu歸檔工具,rc表示(replace and create)

#查看靜態庫中的目錄串列
[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 myadd.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 mysub.o
# t:列出靜態庫中的檔案
# v:verbose 詳細資訊

將上面的檔案按照這樣存放:
在這里插入圖片描述
撰寫Makefile檔案:

path=$(shell pwd)
mytest:mytest.c
	gcc $^ -o $@ -I$(path)/mylib/include -L$(path)/mylib/lib -lmymath -static

.PHONY:clean

clean:
	rm -f mytest

# -I 頭檔案
# -L 指定庫路徑
# -l 指定庫名

#測驗目標檔案生成后,靜態庫刪掉,程式照樣可以運行

可以直接將庫檔案和頭檔案放到系統的頭檔案和庫檔案池(不建議會污染系統的頭檔案和庫檔案池):

# 目標檔案:myadd.h mysub.h ---> /usr/include/stdio.h
# 庫檔案:libmymath.a ---> /usr/lib64

生成動態庫

測驗代碼

//myadd.h
#pragma once 

#include<stdio.h>
int Myadd(int x,int y);

//myadd.c
#include"myadd.h"

int Myadd(int x,int y)
{
	return x+y;
}     

//mysub.h
#pragma once 

#include<stdio.h>
int Mysub(int x,int y);

//mysub.c
#include"mysub.h"

int Mysub(int x,int y)
{
	return x-y;
}             

生成動態庫:

-shared: 表示生成共享庫格式
-fPIC:產生位置無關碼(position independent code)
-庫名規則:libxxx.so

撰寫生成動態庫Makefile檔案:

libmymath.so:myadd.o mysub.o
	gcc -shared $^ -o $@
	
# 生成的.o檔案要與位置無關
myadd.o:myadd.c
	gcc -fPIC -c $<
mysub.o:mysub.c
	gcc -fPIC -c $<
#清除命令
.PHONY:clean
clean:
	rm *.o output libmymath.so

#發布命令
.PHONY:output
output:
	mkdir -p mylib/include
	mkdir -p mylib/lib
	mv *.h mylib/include
	mv *.so mylib/lib

將上面的檔案按照這樣存放:
在這里插入圖片描述
撰寫測驗mytest.c檔案


#include<stdio.h>
#include<myadd.h>
#include<mysub.h>

int main(){
  int x=20,y=10;
  printf("x + y = %d\n",myadd(x,y));
  printf("x - y = %d\n",mysub(x,y));
  printf("Hello World\n");

  return 0;
}

撰寫測驗Makefile檔案

path=$(shell pwd)

#-I:動態庫目錄,-L動態庫頭檔案目錄,-l:動態庫的庫名(去掉lib以及版本號和后最綴名:libmymath.so-->mymath)
mytest:mytest.c
	gcc $^ -o $@ -I$(path)/mylib/include -L$(path)/mylib/lib -lmymath

.PHONY:clean

clean:
	rm -f mytest

告訴作業系統運行時到哪里尋找動態庫:

方法一:

拷貝.so檔案到系統共享庫路徑下, 一般指/usr/lib

方法二:

匯入環境變數LD_LIBRARY_PATH(例如:export LD_LIBRARY_PATH=/home/pengke/Linux/lesson_15/mylibso/tmp/mylib/lib)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272596.html

標籤:其他

上一篇:2021年全網最細 VirtualBox 虛擬機安裝 Ubuntu 20.04.2.0 LTS及Ubuntu的相關配置

下一篇:AD9528資料

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more