Linux系統中fflush,sync,syncfs,fdatasync,fsync的比較


#include <stdio.h>
int fflush(FILE *stream);

fflush 是 C 標准庫提供的函數,對輸入輸出流起作用,起作用的是C標准庫管理的用戶空間文件緩存。對輸出流來說,會使用系統提供的寫文件系統調用(write)把標准庫緩存的數據寫入文件,fflush並不能保證數據真正的寫入文件系統。對輸入流來說,會把從可尋址的文件讀入標准庫緩存的數據給清洗掉。

#include <unistd.h>
void sync(void);
int syncfs(int fd);

sync 和 syncfs 起作用的是文件系統緩存,這些緩存是在內核空間管理的。sync 會把對文件系統的元數據、緩存的文件數據寫入所有底層的文件,對所有文件系統有用。syncfs 需要一個文件描述符,只寫入文件描述符指向的文件所在的文件系統上的數據。有時候突然拔掉優盤,里面的文件會損壞,就是因為優盤上文件的更改沒有從內核文件緩存寫入優盤所導致的。

在linux系統上,sync 和 syncfs 都是阻塞的,會確保數據寫入底層的文件系統。但是在POSIX標准里,sync可能在數據寫入之前返回。

#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);

fsync 把文件描述符fd指向的文件緩存在內核中的所有已修改的數據寫入文件系統,包含數據與文件元數據(文件大小,文件修改時間等)。但是fsync不會寫入對指向文件的目錄項的修改,也就是說如果新創建了一個文件,要是確保下次能正確讀出的話,就需要把所在目錄也fsync一下。

fdatasync 把和fsync作用差不多,但是不會寫入對下次正確讀取文件作用不大的一些元數據(比如上次訪問時間,上次修改時間等),但是大小如果改變了,是會寫進去的。

這兩個系統調用被調用后會阻塞,直到設備報告所有數據都已寫入(設備可能本身也有緩存)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM