到文件上時,通常該數據先由內核複製到緩存中,如果該緩存尚未寫滿,則並不將其排入輸出
隊列,而是等待其寫滿或者當內核需要重用該緩存以便存放其他磁盤塊數據時,再將該緩存排
入輸出隊列,然後待其到達隊首時,才進行實際的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 <unistd.h>
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
函數時就更新文件的內容。
【 fsync系統調用】
功能描述:
同步內存中所有已修改的文件數據到儲存設備。
用法:
#include <unistd.h>
int fsync(int fd);
參數:
fd:文件描述詞。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設爲以下的某個值
EBADF: 文件描述詞無效
EIO : 讀寫的過程中發生錯誤
EROFS, EINVAL:文件所在的文件系統不支持同步