傳統的u n i x實現在核心中設有緩衝儲存器,大多數磁碟i / o都通過快取進行。當將資料寫
到檔案上時,通常該資料先由核心複製到快取中,如果該快取尚未寫滿,則並不將其排入輸出
佇列,而是等待其寫滿或者當核心需要重用該快取以便存放其他磁碟塊資料時,再將該快取排
入輸出佇列,然後待其到達隊首時,才進行實際的i / o操作。這種輸出方式被稱之為延遲寫
(delayed write)(bach 〔1 9 8 6〕第3章詳細討論了延遲寫)。延遲寫減少了磁碟讀寫次數,但是
第4章檔案和目錄8 7
卻降低了檔案內容的更新速度,使得欲寫到檔案中的資料在一段時間內並沒有寫到磁碟上。當
系統發生故障時,這種延遲可能造成檔案更新內容的丟失。為了保證磁碟上實際檔案系統與緩
存中內容的一致性,u n i x系統提供了s y n c和f s y n c兩個系統呼叫函式。
#include
void sync(void);
int fsync(intf i l e d e s) ;
返回:若成功則為0,若出錯則為-1
s y n c只是將所有修改過的塊的快取排入寫佇列,然後就返回,它並不等待實際i / o操作結束。
系統精靈程序(通常稱為u p d a t e )一般每隔3 0秒呼叫一次s y n c函式。這就保證了定期重新整理內
核的塊快取。命令s y n c ( 1 )也呼叫s y n c函式。
函式f s y n c只引用單個檔案(由檔案描述符f i l e d e s指定),它等待i / o結束,然後返回。f s y n c可
用於資料庫這樣的應用程式,它確保修改過的塊立即寫到磁碟上。比較一下f s y n c和o _ s y n c標
志(見3 . 1 3節)。當呼叫f s y n c時,它更新檔案的內容,而對於o _ s y n c,則每次對檔案呼叫w r i t e
函式時就更新檔案的內容。
fflush和fsync的聯絡和區別
[zz ]
1.提供者fflush是libc.a中提供的方法,fsync是系統提供的系統呼叫。2.原形fflush接受乙個引數file *.fflush(file *);fsync接受的時乙個int型的檔案描述符。fsync(int fd);3.功能fflush:是把c庫中的緩衝呼叫write函式寫到磁碟[其實是寫到核心的緩衝區]。fsync:是把核心緩衝刷到磁碟上。
c庫緩衝-----fflush---------〉核心緩衝--------fsync-----〉磁碟
再轉一篇英文的
fsync與fflush的關係和區別
read write fsync linux底層操作 核心呼叫,涉及到程序上下文的切換,即使用者態到核心態的轉換,這是個比較消耗效能的操作。fread fwrite fflush c語言標準規定的io流操作,建立在read write fsync之上 在使用者層,又增加了一層緩衝機制,用於減少核心呼...
關於fflush函式的使用
fflush stdin fflush stdout 用來強制重新整理緩衝區資料。如果需要在每次i o操作前後,不希望緩衝中存在歷史資料或者不期望的資料或者為了清除快取等的時候使用,通常是為了確保不影響後面的資料讀取 例如在讀完乙個字串後緊接著又要讀取乙個字元,此時應該先執行fflush stdin...
關於fsync的問題及學習
1.問題 因為需要寫乙個非常重要的檔案,需要避免因系統突然斷電造成的檔案內容丟失問題的發生。而在呼叫了fopen fwrite以及sync之後,會導致系統執行過程中使用者操作卡一下。原因是sync會將buffer中所有已修改資料寫入磁碟中,如果資料量大比如會影響到系統效能。所以考慮使用fsync來s...