Linux/unixI/O:將設(shè)備映射為文件的方式,允許Unix內(nèi)核引出一個簡單、低級的應(yīng)用接口。
Linux/unix IO的系統(tǒng)調(diào)用函數(shù)很簡單,它只有5個函數(shù):open(打開)、close(關(guān)閉)、read(讀)、write(寫)、lseek(定位)。但是系統(tǒng)IO調(diào)用開銷比較大,一般不會直接調(diào)用,而是通過調(diào)用Rio包進行健壯地讀和寫,或者調(diào)用C語言的標準I/O進行讀寫。盡管如此,Rio包和標準IO也都是封裝了unix I/O的,所以學(xué)習系統(tǒng)IO的調(diào)用才能更好地理解高級IO的原理。
1、打開文件返回一個小的非負整數(shù),即描述符。用描述符來標識文件。每個進程都有三個打開的文件:標準輸入(0)、標準輸出(1)、標準錯誤(2)
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(char *filename, int flags, mode_t mode); //返回:若成功則為新文件描述符,若出錯為-1
flags:進程打算如何訪問文件
O_RDONLY:只讀O_WRONLY:只寫O_RDWR:可讀可寫
也可以是一個或更多位掩碼的或:
O_CREAT:如文件不存在,則創(chuàng)建
O_TRUNC:如果文件已存在,則截斷
O_APPEND:每次寫操作,設(shè)置k到文件結(jié)尾
mode:指定新文件的訪問權(quán)限位
每個進程都有一個umask,通過調(diào)用umask函數(shù)設(shè)置。所以文件的權(quán)限為被設(shè)置成mode&~umask
2、改變當前文件位置從文件開頭起始的字節(jié)偏移量。系統(tǒng)內(nèi)核保持一個文件位置k,對于每個打開的文件,起始值為0。應(yīng)用程序執(zhí)行seek,設(shè)置當前位置k,通過調(diào)用lseek函數(shù),顯示地修改當前文件位置。
3、讀寫文件。讀操作:從文件拷貝n個字節(jié)到存儲器,從當前文件位置k開始,將k增加到k+n,對于一個大小為m字節(jié)的文件,當k>=m時,讀操作觸發(fā)一個EOF的條件。寫操作:從存儲器拷貝n個字節(jié)到文件,k更新為k+n
#include <unistd.h>ssize_t read(int fd, void *buf, size_t n); //返回:若成功則為讀的字節(jié)數(shù),若EOF則為0,若出錯為-1.ssize_t write(int fd, const void *buf, size_t n); //返回:若成功則為寫的字節(jié)數(shù),若出錯則為-1.
read函數(shù):從描述符為fd的當前文件位置拷貝至多n個字節(jié)到存儲器位置buf。返回-1表示一個錯誤,返回0表示EOF,否則返回實際讀取的字節(jié)數(shù)。
write函數(shù):從存儲器位置buf拷貝至多n個字節(jié)到描述符fd的當前文件位置。
Ps:ssize_t與size_t區(qū)別:size_t:unsignedint,ssized_t:int。
4、關(guān)閉文件:內(nèi)核釋放文件打開時創(chuàng)建的數(shù)據(jù)結(jié)構(gòu),并恢復(fù)描述符到描述符池中,進程通過調(diào)用close函數(shù)關(guān)閉一個打開的文件。關(guān)閉一個已關(guān)閉的描述符會出錯。
#include <unistd.h>int close(int fd); //返回:若成功則為0,若出錯則為-1.
新聞熱點
疑難解答
圖片精選