1. 程式人生 > >【Linux】檔案IO --- sync、fsync、fdatesync

【Linux】檔案IO --- sync、fsync、fdatesync

在使用write函式向檔案中寫入資料的時候,並不是在呼叫了函式以後就直接把資料寫入磁碟;作業系統在核心中設定了一塊專門的緩衝區,資料會先被寫入到核心的緩衝區中,等到緩衝區滿了或者系統需要重新利用緩衝區的時候才會將緩衝區的資料排入到寫佇列中去,待到達對首的時候,就將資料寫入到磁碟中。這就是延遲寫,因為不是馬上將更改後的資料刷入到磁碟中,所以就會導致緩衝區中的資料和磁碟中的資料不一致。

======================

sync函式:

void sync(void);

fsync 和 fdatasync:

int fsync(int fd);

int fdatasync(int fd);

函式引數:

fd:要操作的檔案描述符

返回值:

呼叫成功返回0

失敗返回-1

=======================

  • sync函式會強制將核心中的所有修改過的緩衝區重新整理,並立刻返回,不會等到實際的I/O操作完成後再返回。所以sync函式並不能保證資料一定寫入到了磁碟中。在Linux中有一個名為update的守護程序會定期(幾秒或幾十秒)呼叫sync函式,來重新整理核心緩衝區。
  • fsync函式會強制將核心中與fd檔案相關的緩衝區重新整理,並等待到實際I/O操作結束後再返回,如果實際I/O操作未結束,那麼函式將一直處於阻塞狀態。所以fsync函式可以保證資料一定被寫入到磁碟中。
  • fdatasync函式和fsync函式類似,唯一的區別就是fdatasync函式只會將檔案的資料部分更新到磁碟中,而fsync函式不僅會將檔案的資料部分還會將檔案的屬性更新到磁碟中。