Linux系统中fflush,sync,syncfs,fdatasync,fsync的比较
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作用差不多,但是不會寫入對下次正確讀取文件作用不大的一些元數據(比如上次訪問時間,上次修改時間等),但是大小如果改變了,是會寫進去的。
這兩個系統調用被調用后會阻塞,直到設備報告所有數據都已寫入(設備可能本身也有緩存)。
轉載于:https://www.cnblogs.com/kercker/p/8610988.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux系统中fflush,sync,syncfs,fdatasync,fsync的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ShareSDK完成第三方(QQ、微
- 下一篇: git的使用学习(三)时光机穿梭