1. 程式人生 > >Linux--檔案IO中幾點注意的地方

Linux--檔案IO中幾點注意的地方

檔案IO中幾點注意的地方

一、open函式

開啟存在並有內容的檔案時可用選項:O_APPENDO_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。