**linux 檔案操作
1 linux檔案操作
1.1 系統呼叫
系統呼叫發生核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫來進行檔案操作,會有使用者空間到核心空間的開銷。但通過系統呼叫來訪問檔案是最直接的方式,系統呼叫函式直接作用於作業系統核心的裝置驅動程式從而實現檔案訪問。檔案描述符fd是乙個非負檔案描述符:0--standard input,1--standard output,2-- standard errror。
1.1.1 函式open
系統呼叫open的作用是開啟乙個 檔案,並返回這個檔案的 描述符。
1)如果兩個程式同時開啟乙個檔案, 會得到不同的檔案描述符。
如果 同時對兩個檔案進行操作,他們各自操作,互不影響,彼此 相互覆蓋(後寫入的會覆蓋先寫入的),為了 防止檔案 的讀寫衝突,可以使用檔案鎖的 功能。(因為檔案描述符是程序的私有屬性)
2)新檔案描述符總是使用未用描述符的最小值。
列如乙個程式關閉了自己的 標準輸出(這裡的標準輸出完全等於1,也就是說描述符1一定是用來做輸出的,只不過預設繫結到螢幕裝置),然後再次呼叫open,檔案描述符1 就會被重新使用,並且標準 輸出(還是1,標準輸出就是1)將被有效 重定向到另乙個檔案或裝置(現在繫結的)
3)執行中的程式能夠一次開啟的檔案數目是由限制的。
這個限制由標頭檔案limits.h中的open_max常數定義,它隨著系統的不同而不同,但posix規範要求它至少要為16。
open函式
標頭檔案:
#include #include #include 函式原型:
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode );
引數說明:
path:準備開啟的檔案或裝置名字。
oflags:指出要開啟檔案的訪問模式。
o_rdonly 【3選1】以唯讀方式開啟
o_wronly 【3選1】以只寫方式開啟
o_rdwr 【3選1】以讀寫方式開啟
o_trunc 【|可選】把檔案長度設為零,丟棄以後的內容。
o_creat 【|可選】如果需要,就按引數mode中給出的訪問模式建立檔案。
o_excl 【|可選】與o_creat一起呼叫,確保呼叫者建立出檔案。使用這個模式可防止兩個程式同時建立乙個檔案,如果檔案已經存在,open呼叫將失敗。
mode:當使用o_creat標誌的open來建立檔案時,我們必須使用三個引數格式的open呼叫。第三個引數mode 是幾個標誌按位or後得到的。
s_irusr:讀許可權,檔案屬主
s_iwusr:寫許可權,檔案屬主
s_ixusr:執行許可權,檔案屬主
s_irgrp:讀許可權,檔案所屬組
s_iwgrp:寫許可權,檔案所屬組
s_ixgrp:執行許可權,檔案所屬組
s_iroth:讀許可權,其他使用者
s_iwoth:寫許可權,其他使用者
s_ixoth:執行許可權,其他使用者
1.1.2 函式close
close系統呼叫用於「關閉」乙個檔案。檔案描述符被釋放,並能夠重新使用。當乙個程序終止時,核心自動關閉它開啟的所有檔案,很多程式都是利用了這一功能而不顯式的用close關閉檔案。
close函式
標頭檔案:
#include 函式原型:
int close(int fd);
引數說明:
int:函式返回值close成功返回0,出錯返回-1
1.1.3 函式read
從與檔案描述符放fd相關的檔案中讀取nbytes個位元組的資料到 buf中,返回實際讀入的位元組數。
read函式
標頭檔案:
#include 函式原型
size_t read(int fd, void *buf, size_t nbytes);
引數說明:
fd:檔案描述符,標識要讀取的檔案。如果為0,則從標準輸入讀資料。
buf:緩衝區,用來儲存讀入的資料。
nbytes:要讀取的字元數。
size_t:返回值,返回成功讀取的字元數,它可能會小於請求的位元組數。-1表示出現錯誤。
1.1.4 函式write
將字串buf中前 nbytes個位元組的資料寫入與檔案描述符fd相關聯的 檔案中,返回實際寫入的位元組數。
write函式
標頭檔案:
#include 函式原型:
size_t write(int fd, const void *buf, size_t nbytes);
引數說明:
fd:檔案描述符,目標檔案。例如:fd的值為1,就向標準輸出寫資料,
buf:待寫入的字串。
nbytes:要寫入的字元數。
size_t:函式返回值,返回成功寫入檔案的字元數。-1表示出現錯誤。
1.1.5 函式lseek
lseek對檔案描述符fd指定檔案的讀寫指標進行 設定,也就是說,它可以設定檔案的下乙個讀寫位置。
標頭檔案:
#include #include 函式原型:
off_t lseek(int filedes, off_t offset, int whence);
引數說明:
off_set:引數用來指定位置
whence:引數定義該偏移值的用法。
whence可以取下列值
seek_set:offset是乙個絕對位置
seek_cur:offset是相對於當前位置的乙個相對位置
seek_end:offset是相對於檔案尾的乙個相對位置
off_t:lseek返回從檔案到檔案指標被設定處的位元組偏移,失敗時返回-1.引數offset的型別off_t是乙個與具體實現有關的整數型別,它定義在sys/types.h中
1.1.6 函式dup和函式dup2
dup,dup2系統呼叫。dup提供了複製檔案描述符的方法,使我們能夠兩個或 更多不同的檔案描述符來訪問同乙個檔案。也可用於在檔案的不同位置對資料進行讀寫
標頭檔案:
#include dup系統呼叫複製檔案描述符fildes,返回乙個新的檔案描述符。
int dup(int fildes);
dup2系統呼叫則是通過明確指定描述符來把乙個檔案描述符複製為另乙個檔案描述符
int dup2(int fildes,int fildes2);
Linux C 檔案操作
系統呼叫比標準庫移植性差 不同os介面不一定一致 系統呼叫會進入核心態,對程式執行的開銷較大.預設檔案描述符 0 標準輸入 1 標準輸出 2 標準錯誤輸出 include include include include include define maxline 80 void if error ...
Linux c檔案操作總結
這一周以來一直與linux的檔案操作相關系統呼叫打交道,其與c語言中的檔案操作函式有些許相似但又千差萬別.尤其是open 函式的引數,相當複雜,因此作以記錄便於查閱.對於用linux系統呼叫進行檔案的常用操作作以總結 主要是關於open 系統呼叫的各個引數做記錄.簡述 open是unix系統 包括l...
linux c檔案相關操作
1,操作檔案,需要檔案控制代碼 標頭檔案 include 若用fgets函式讀取檔案內容,需要注意fgets函式的使用。函式宣告 char fgets char str,int n,file stream 引數 str 這是指向乙個字元陣列的指標,該陣列儲存了要讀取的字串。n 這是要讀取的最大字元數...