r:只讀
r+:讀寫
w:只寫
w+:讀寫
a:追加寫(每次寫入數據總是寫入到檔案末尾)
a+:追加讀寫
b:二進制操作
fopen
FILE* fopen(char* filename,char* mode); //filename--檔名稱,mode--開啓方式
fread、fwrite
// buf--緩衝區,block_size--塊大小,block_count--塊個數,fp--檔案流指針
size_t fread(char* buf,size_t block_size,size_t block_count,FILE* fp);
// data--數據首地址,block_size--塊大小,block_count--塊個數,fp--檔案流指針
size_t fwrite(char* data,size_t block_size,size_t block_count,FILE* fp);
fseek
int fseek(FILE* fp,long offset,int whence);
fclose
int fclose(FILE* fp);
open
開啓指定檔案
int open(char* filename,int flag,mode_t mode);
write
向指定檔案中寫入指定長度的數據
ssize_t write(int fd,char* data,size_t len);
read
從檔案中讀取指定長度的數據,放到buf中
ssize_t read(int fd,char* buf,size_t len);
lseek
跳轉讀寫位置
off_t lseek(int fd,off_t offset,int whence);
/*例*/ lseek(fd,0,SEEK_END); //返回的剛好爲檔案大小
close
通過檔案描述符關閉檔案,釋放資源
int close(int fd);
概念:檔案描述符其實是內核中一個檔案描述資訊陣列的下標,通過這個下標可以在內核中找到相應的檔案描述資訊,通過描述資訊可以實現檔案操作
檔案描述符與檔案流指針的關係
緩衝區
改變描述符所指向的檔案描述資訊,改變當前描述符所操作的檔案,最終改變數據的流向。實際是描述符的重定向,將數據不再寫入原本的檔案,而是寫入新的指定檔案中
int dup2(int oldfd,int newfd) //描述符重定向函數
檔案系統就是磁碟上管理檔案的系統。linux下ext2檔案系統將磁碟分爲五個區域:超級塊、inode bitmap1、data bitmap、inode、data
檔案的儲存:通過超級塊找到inode點陣圖/數據塊點陣圖,通過數據塊點陣圖快速找到空閒的磁碟塊儲存檔案數據,通過inode點陣圖快速找到空閒的inode節點,儲存檔案的元資訊
檔案的獲取:通過檔名到父目錄檔案中找到檔案對應的目錄項,得到檔案的inode節點號,在磁碟超級塊中找到inode節點區域,根據inode節點號,快速找到inode節點,得到數據儲存的磁碟塊號(數據塊位置),進而獲取到檔案數據
軟鏈接檔案/硬鏈接檔案:給一個原始檔建立一個軟鏈接檔案/硬鏈接檔案,就可以通過被建立出來的軟鏈接/硬鏈接檔案來操作原始檔
ln test.txt test.hard // 爲原始檔建立一個硬鏈接檔案
ln -s test.txt test.soft // 爲原始檔建立一個軟鏈接檔案
軟連線檔案和硬鏈接檔案的區別:
軟連線檔案 | 硬鏈接檔案 |
---|---|
軟鏈接檔案是獨立的檔案,有自己的inode號,裏面儲存着原始檔的路徑,通過路徑存取原始檔數據 | 硬鏈接檔案是一個檔案的目錄項(只是原始檔的別名),和原始檔共用一個inode號,通過inode節點存取原始檔數據 |
刪除原始檔,軟鏈接檔案失效 | 刪除原始檔, 硬鏈接檔案只是鏈接數-12 3,依然可以存取原始檔數據 |
軟鏈接檔案可以對目錄建立 | 硬鏈接檔案不可以對目錄建立 |
軟鏈接檔案可以跨分割區建立 | 硬鏈接檔案不可以跨分割區建立 |
庫檔案:打包了一堆實現了常用功能的程式碼檔案
gcc -c child.c -o child.o
;生成動態庫時最好加上-fPIC產生位置無關的程式碼:gcc -c -fPIC child.c -o child.o
.o
檔案以及庫檔案打包生成自己的庫檔案gcc -shared child.o -o libmychild.so
;動態庫的命名方式:lib***.soar -cr libmychild.a child.o
;靜態庫命名方式:lib***.a生成可執行程式時鏈接使用:
執行可執行程式時載入使用:僅僅針對動態庫(只有動態庫纔會在執行時載入庫檔案)