天天看點

Linux C flie操作: open write read lseek close函數分析

函數類型: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