Linux學習筆記 檔案讀寫小細節

Quartz010發表於2016-10-19

open 函式的flag

int open(const *pathname, int falg, int parm)

 O_RDONLY             //檔案只讀
 O_WRONLY             //檔案只寫
 O_CREAT              //不存在時建立檔案(存在就直接清空後覆寫)
 O_RDWR               //檔案讀寫
 O_EXCL               //與O_CREAT共同作用,在試圖覆寫時報錯
 O_TRUNC              //從檔案頭開始覆寫
 O_APPEND             //在檔案尾追加寫入
  • open的第三個引數,只在O_CREAT存在下有用,用於控制其建立的許可權(如 0777, 0666)
  • open的O_EXCL引數,與O_CREAT共同作用,再其檔案存在時直接報錯,防止檔案被清空
  • 上述錯誤可以結合errno.h的庫 通過perror()列印錯誤

lseek()函式

off_t lseek(int fd, off_t offset, int whence)
  • whence為當前檔案指標的基點
  • SEEK_SET
  • SEEK_CUR
  • SEEK_END
  • 返回值是實際指標偏移的值
  • len = lseek(fd, 0, SEEK_END)
    可以返回檔案的長度

lseek也可以製作空洞檔案
即中間通過指標的移動,跳過一段,即製造了檔案空洞
(用於多執行緒的檔案寫,想想迅雷,差不多的)

當檔案被同一程式開啟兩次的時候

得到兩個fd的值,就會有兩個檔案的指標,
當對檔案進行讀寫時,兩個指標從頭開始寫,兩個寫入的內容會相互覆蓋,同樣的,讀取的檔案會重複,
這時,給出其open()同時加入O_APPEND引數,這樣就可以同步讀寫了

fd1 = open(FILEPATH, O_RDWR | O_APPEND)
fd2 = open(FILEPATH, O_RDWR | O_APPEND)

相關文章