#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作用差不多,但是不會寫入對下次正確讀取文件作用不大的一些元數據(比如上次訪問時間,上次修改時間等),但是大小如果改變了,是會寫進去的。
這兩個系統調用被調用后會阻塞,直到設備報告所有數據都已寫入(設備可能本身也有緩存)。