Linux--檔案IO中幾點注意的地方
檔案IO中幾點注意的地方
一、open函式
開啟存在並有內容的檔案時可用選項:O_APPEND
、O_TRUNC
(1)I0檔案指標在檔案開頭,新內容寫在前面,依次覆蓋舊的內容:
open("a.txt", O_RDWR);
(2)檔案指標被設定到檔案底部,新內容新增在舊內容的後面:
open("a.txt", O_RDWR|O_APPEND);
(3)檔案長度擷取為0,新內容寫在前面,舊內容被刪除:
open("a.txt", O_RDWR|O_TRUNC);
(4)檔案長度擷取為0,新內容寫在前面,舊內容被刪除:
open("a.txt", O_RDWR|O_APPEND|O_TRUNC) ;
二、lseek的使用
系統函式open
加了引數O_APPEND
之後,再去呼叫lseek
函式移動檔案指標是無效的!新增的檔案內容始終在檔案末尾。
fd = open("a.txt", O_RDWR|O_APPEND);
ret = lseek(fd, 4, SEEK_SET);
三、O_APPEND解決覆蓋問題
資料來源:朱老師嵌入式Linux
多次開啟同一個檔案,得到了不同的檔案描述符,分別對他們進行寫操作,這個時候的寫操作為分別寫
,有時候我們希望接續寫而不是分別寫?辦法就是在open時加O_APPEND標誌即可進行接續寫
。
O_APPEND的實現原理和其原子操作性說明:
(1)O_APPEND為什麼能夠將分別寫改為接續寫?關鍵的核心的東西是檔案指標。分別寫的內部原理就是2個fd擁有不同的檔案指標,並且彼此只考慮自己的位移。但是O_APPEND標誌可以讓write和read函式內部多做一件事情,就是移動自己的檔案指標的同時也去把別人的檔案指標同時移動。(也就是說即使加了O_APPEND,fd1和fd2還是各自擁有一個獨立的檔案指標,但是這兩個檔案指標關聯起來了,一個動了會通知另一個跟著動)
(2)O_APPEND對檔案指標的影響,對檔案的讀寫是原子的。
(3)原子操作的含義是:整個操作一旦開始是不會被打斷的,必須直到操作結束其他程式碼才能得以排程執行,這就叫原子操作。每種作業系統中都有一些機制來實現原子操作,以保證那些需要原子操作的任務可以執行。
四、複製檔案描述符
dup()用法
int dup(int oldfd);
系統呼叫函式dup()會複製舊的檔案描述符oldfd,使用最小的沒有使用的檔案描述符編號,從而返回一個新的檔案描述符。在成功的建立之後,新的和舊的檔案描述符可能被交替呼叫,他們指向同一個開啟的檔案,共享檔案指標和狀態標誌;例如,使用lseek
改變一個描述符的檔案指標位置,另外一個檔案描述符中的指標位置也會同樣變化。
dup2()用法
int dup2(int oldfd, int newfd);
dup2()和dup()不一樣的地方是,dup2()可以指定檔案描述符的編號為newfd。如果newfd已經打開了,則會先將newfd關閉。如果newfd等於oldfd,則返回newfd,並不會關閉newfd。