C言語

【C言語】fsync関数の使い方、正しく理解していますか?

関数仕様

書式

引数

fd fsync を行うファイルディスクリプタ

戻り値

0 fsync の実行に成功
-1 エラーが発生

 

機能

  • ファイルディスクリプタが指すメモリ上のキャッシュをストレージに書き込む
  • カーネル内のディスクキャッシュをストレージデバイスに書き込む

 

注意すること

注意ポイント①

fsync にファイルを指すディスクリプタを指定した場合、ディレクトリエントリは書き込まれない。

fsync は引数 fd のファイルディスクリプタで指定したファイルについて、個別に sync 動作を行います。
つまり、fd で個別のファイルを指定した場合は、ファイルが存在しているディレクトリのエントリが
ディスクへ書き込まれたことを保証するわけではありません。

ファイルの書き込みを保証するためには、明示的にそのディレクトリのファイルディスクリプタに対しても
fsync を実行する必要があります。

 

注意ポイント②

fsync は、指定したファイルディスクリプタの同期処理が完了しないと返ってこない。

fsync の戻り値からも分かるように、引数 fd で指定した個別のファイルの同期処理が完了するまで
呼出し元に戻ってきません。

処理タイミングがシビアな場合や、遅延が許されないシステムでは、
書き出し用のスレッドを起こすなどして他の処理を止めない工夫が必要になります。

 

注意ポイント③

古いファイルシステムを使用する場合は、fsync に対応していない場合がある。

fsync のシステムコールは、ファイルシステムごとに実装されています。

古いファイルシステムの場合、fsync の処理が実装されていない場合がありますので、
使用する前に確認する必要があります。

 

サンプルプログラム

 

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, ,