本文用於記錄在LINUX編程中,常用的文件操作函數,包括系統調用和庫函數。
針對輸入輸出操作,直接使用底層系統調用的一個問題是它們的效率十分低,原因在於:
1.使用系統調用會影響系統的性能,與函數調用相比,系統調用的開銷要大些,因為在執行系統調用時,Linux必須從運行用戶代碼切換到執行內核代碼,然後再返回用戶代碼。
2.硬件會限制對底層系統調用一次所能讀寫的數據塊大小。比如,磁帶機通常一次能寫的數據塊長度是10K,所以若你試圖寫的數據量不是10K的整數倍,磁帶機還是以10K為單位卷繞磁帶,從而在磁帶上留下空隙
#include
size_t write(int fildes, const void *buf, size_t nbytes);
系統調用write作用:把緩沖區buf的前nbytes個字節寫入與文件描述符fildes關聯的文件中。它返回實際寫入的字節數,若文件描述符有錯或底層的設備驅動程序對數據塊長度比較敏感,該返回值可能會小於nbytes。如果函數返回0,就表示未寫入任何數據;如果返回-1,就表示write調用中出現了錯誤,錯誤代碼保存在全局變量errno裡。 #include
size_t read(int fildes, void *buf, size_t nbytes);
系統調用read作用:從與文件描述符fildes關聯的文件裡讀入nbytes個字節的數據,並把它們放到數據區buf中。它返回實際讀入的字節數,該返回值可能會小於請求的字節數。如果函數返回0,就表示未讀入任何數據,已到達文件尾。如果返回-1,就表示read調用中出現了錯誤,錯誤代碼保存在全局變量errno裡。 #include
#include
#include
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);
系統調用open作用:調用成功返回一個唯一的新文件描述符(總是一個非負整數),失敗時返回-1並設置全局變量errno。准備打開的文件或設備的名字作為參數path傳遞給函數,oflags參數用於指定打開文件所采取的動作。oflags可選參數如下:
當使用帶有O_CREAT標志的open調用來創建文件時,必須使用有3個參數格式的open調用,其中第三個參數mode有以下標志位:
以上這些標志位在頭文件sys/stat.h中定義
#include
int close(int fildes);
終止文件描述符fildes與其對應文件之間的關聯。文件描述符被釋放並能夠重新使用。close調用成功時返回0,出錯時返回-1 #include
#include
off_t lseek(int fildes, off_t offset, int whence);
offset參數用來指定位置,而whence參數定義偏移值,whence可以取下列值:
lseek返回從文件頭到文件指針被設置處的字節偏移值,失敗時返回-1。
#include
#include
#include
int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
fstat系統調用返回與打開的文件描述符相關的文件的狀態信息,該信息將會寫入到一個buf結構中,buf的地址以參數形式傳遞給fstat
相關函數stat和lstat返回的是通過文件名查到的狀態信息。它們產生相同的結果,但當文件是一個符號鏈接時,lstat返回的是該符號鏈接本身的信息,而stat返回的是該鏈接指向的文件的信息。
stat結構一般包括如下成員:
stat結構中返回的st_mode標志還有一些與之關聯的宏,它們定義在sys/stat.h中。
這些宏包括對訪問權限、文件類型標志以及一些用於幫助測試特定類型和權限的掩碼的定義。
#include
int dup(int fildes);
int dup2(int fildes, int fildes2);
dup系統調用提供一種復制文件描述符的方法,使我們能夠通過兩個或更多個不同的描述符來訪問同一個文件。這可以用於在文件的不同位置對數據進行讀寫。dup系統調用復制文件描述符fildes,返回一個新的描述符。dup2系統調用則是通過明確指定目標描述符來把一個文件描述符復制為另外一個。
#include
FILE *fopen(const char *filename, const char *mode);
fopen庫函數類似於底層的open系統調用。它主要用於文件和終端的輸入輸出。如果需要對設備進行明確的控制,則最好使用系統調用,因為這可以避免用庫函數帶來的一些潛在問題,如輸入/輸出緩沖。
fopen打開由filename參數指定的文件,並把它與一個文件流關聯起來。mode參數指定文件的打開方式,它取下列字符串中的值:
fopen在成功時返回一個非空的FILE*指針,失敗時返回NULL值,NULL值在stdio.h中定義
#include
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);