バッファリングのレイヤーと考えてください。
fopen
およびのような標準のC呼び出しに精通している場合はfprintf
、Cランタイムライブラリ自体で発生するバッファリングにすでに注意している必要があります。
これらのバッファをフラッシュする方法fflush
は、情報がCランタイムライブラリからOS(または周囲の環境)に確実に渡されるようにすることです。
ただし、OSに搭載されているからといって、ディスク上にあるとは限りません。OS内でもバッファリングされる可能性があります。
これfsync
が処理され、OSバッファ内のものが物理的にディスクに書き込まれるようにします。
通常、この種の操作はロギングライブラリで見られます。
fprintf (myFileHandle, "something\n"); // output it
fflush (myFileHandle); // flush to OS
fsync (fileno (myFileHandle)); // flush to disk
fileno
は、特定のファイルハンドルの基になるint
ファイル記述子を提供する関数であり、記述子上で最終レベルのフラッシュを実行します。FILE*
fsync
ディスクの書き込みは通常、メモリ内の転送よりもかなり遅いため、これは比較的コストのかかる操作です。
ライブラリのロギングだけでなく、もう1つのユースケースがこの動作に役立つ場合があります。それが何だったか思い出せるか見てみましょう。はい、それだけです。データベース!BerzerkelyDBのように。データがディスク上にあることを確認したい場合、ACID要件を満たすためのかなり便利な機能:-)