c-c++-file-sync
C/C++ File Sync
- Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。
- 當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該緩衝區以便存放其他資料時,才會將該緩衝區排入輸出佇列,然後等它到達隊首時,才進行實際的I/O操作。
- 這就是被稱為 延遲寫的輸出方式。
- 延遲寫減少了磁碟讀次數,但是卻減低了檔案內容跟新的速度。
- 當系統發生故障時,延遲寫的方式可能造成檔案跟新丟失。
- 為了應對此種情況,linux下提供了 sysnc, fsync, fdatasync 三個函式來保證實際檔案系統與緩衝區中內容的一致。- #include <unistd.h>
sync
該函式只是將所有修改過的塊緩衝區排入寫佇列,然後就返回,他並不等待實際寫磁碟操作結束
fsync
int fsync(int fd);
只對由檔案描述符fd指定的一個檔案起作用,並且等待寫磁碟操作結束才返回。
return
int fdatasync(int fd);
類似於fsync,但是只影響檔案的資料部分。而除資料外,fsync還會同步更新檔案的屬性。
return
- On success, these system calls return zero.
- On error, -1 is returned, and errno is set to indicate the error.
The aim of fdatasync() is to reduce disk activity for applications that do not require all metadata to be synchronized with the disk.
C庫的 fflush
標準的I/O函式(如 fread, fwrite)會在記憶體建立緩衝,該函式重新整理記憶體緩衝,將內容寫入核心緩衝,要想將其寫入磁碟,還需要呼叫fsync(先呼叫 fflush 然後再呼叫 fsync,否則不起作用);
關係
-c庫緩衝-----fflush---------〉核心緩衝--------fsync-----〉磁碟