函數類型:open、 write、 read、 lseek、 close函數屬于檔案的系統調用。
包含有檔案:<sys/stat.h>,<sys/types.h>,<fcntl.h>
檔案描述符:實質就是一個整數,當做是檔案的ID,在系統中唯一辨別檔案。對檔案read、write、lseek、close操作時就會用到檔案描述符。系統開始運作時,一般會有三個已經打開的檔案描述符:
- 0:标準輸入
- 1:标準輸出
- 2:标準錯誤
1,open函數
Linux中open的函數原型有兩個:
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode );
參數說明。
@path:準備打開的檔案或裝置名字。如:path="/home/work/text.txt"
@oflags:指出要打開檔案的通路模式,三種通路模式如下:
O_RDONLY: 隻讀方式打開檔案
O_WRONLY: 隻寫方式打開檔案
O_RDWR: 讀寫方式打開檔案
注意:
1,O_RDONLY、O_WRONLY、O_RDWR三個标志隻能使用任意的一個。
2,open調用還可以在oflags參數中包括下列可選模式進行組合(用按位或"|"操作),部分可選模式如下:
O_APPEND: 以追加的方式打開檔案
O_CREAT 建立一個檔案
O_EXCL如果使用了O_CREAT而且檔案已經存在,就會發生一個錯誤
O_NOBLOCK 以非阻塞的方式打開一個檔案
O_TRUNC 如果檔案已經存在,則删除檔案的内容
@mode:如果flags中使用了O_CREAT标志,則調用open函數的時候不僅需要加上打開檔案的模式(oflags),還需要設定檔案的使用者權限(mode)。
常見的mode如下:
S_IRWXU 使用者可以讀、寫、執行
S_IRUSR 使用者可以讀
S_IWUSR 使用者可以寫
S_IXUSR 使用者可以執行
S_IRWXG 組可以讀、寫、執行
S_IRGRP 組可以讀
S_IWGRP 組可以寫
S_IXGRP 組可以執行
S_IRWXO 其他使用者可以讀、寫、執行
S_IROTH 其他使用者可以讀
S_IWOTH 其他使用者可以寫
S_IXOTH 其他使用者可以執行
S_ISUID 設定使用者執行ID
S_ISGID 設定組的執行ID
注意:1,mode也可以用數字表示,和chmod 777 /usr/a.out用法類似。從最高位開始分别對應的權限是:目前使用者權限,組權限,其他使用者權限。
2,每一位是一個八進制數,{r,w,x}=第一位表示讀權限,第二位表示寫權限,第三位表示可執行權限。有權限則設為1,沒有則設為0.建議使用數字表示權限,用起來友善簡潔。
eg,
int fd;
fd = open("../test/myfile", O_RDWR | O_CREAT, 0644); //mode也可以用S_IRWXU| S_IRGRP| S_IROTH表示
or
fd=open(/home/test/text.c,O_RDWR);
@傳回值:成功傳回的fd>0,失敗傳回的fd<0(fd=-1).
2,read函數
Linux中read的函數原型:
size_t read(int fildes, void *buf, size_t nbytes);
參數說明:
fildes:檔案描述符,辨別要讀取的檔案。如果為0,則從标準輸入讀資料。類似于scanf()的功能。
*buf:緩沖區,用來存儲讀入的資料。
nbytes:要讀取的字元數。
傳回值:size_t傳回成功讀取的字元數,它可能會小于請求的位元組數。
3,write 函數
Linux 中write()的函數原型:
size_t write(int fildes, const void *buf, size_t nbytes);
參數說明:
fildes:檔案描述符,辨別了要寫入的目标檔案。例如:fildes的值為1,就像标準輸出寫資料,也就是在顯示屏上顯示資料;如果為 2 ,則想标注錯誤寫資料。
*buf:待寫入的檔案,是一個字元串指針。
nbytes:要寫入的字元數。
函數傳回值:size_t 傳回成功寫入檔案的字元數。需要指出的是,write可能會報告說他寫入的位元組比你所要求的少。這并不一定是個錯誤。在程式中,你需要檢查error已發現錯誤,然後再次調用write寫入剩餘的資料。
4,lseek函數
Linux 中lseek()的函數原型:
off_t lseek(int fd, off_t offset, int whence);
fd是打開的檔案描述符,offset是與參考偏移的位置,whence是檔案參考的位置,它一共有三個位置,
SEEK_SET 檔案開始,如果使用此偏移,那麼檔案定位到offset的位置
SEEK_CUR 檔案讀寫指針的目前位置
SEEK_END 檔案結尾
lseek傳回值是檔案讀寫指針移動之後的位置,-1表示失敗
a,取得檔案目前偏移位置可以如下: f_offset = lseek(fd, 0, SEEK_CUR);
b,檔案大小可以通過下面: f_len = lseek(fd, 0, SEEK_END);
c,使用lseek函數移動好讀寫指針之後,使用read,write即可往檔案裡面讀寫資料。
5,close函數
Linux 中close()的函數原型:
int close(int fildes);
作用:close系統調用用于“關閉”一個檔案,close調用終止一個檔案描述符fildes以其檔案之間的關聯。檔案描述符被釋放,并能夠重新使用。
傳回值:close成功傳回1,出錯傳回-1.
參考:1,http://www.cnblogs.com/yanlingyin/archive/2012/08/04/2617209.html
2,http://blog.csdn.net/yao_guet/article/details/6460900