fsync(2) メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる

書式

#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

fsync(): _BSD_SOURCE || _XOPEN_SOURCE

         || /* glibc 2.8 以降では: */ _POSIX_C_SOURCE >= 200112L
fdatasync(): _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500

説明

fsync() は、ファイル記述子 fd で参照されるファイルの、メモリ内で存在す る修正されたデータ (つまり修正されたバッファキャッシュページ) を、ディスクデ バイス(またはその他の永続ストレージデバイス) に転送 (「フラッシュ」) し、これ により、システムがクラッシュしたり、再起動された後も、変更された全ての情報が 取り出せるようになる。「フラッシュ」には、ライトスルー (write through) や (存在する場合には) ディスクキャッシュのフラッシュも含まれる。この呼び出しは 転送が終わったとデバイスが報告するまでブロックする。またファイルに結びついた メタデータ情報 (stat(2) 参照) もフラッシュする。

fsync() の呼び出しは、ファイルが存在しているディレクトリのエントリがディスクへ 書き込まれたことを保証するわけではない。 保証するためには明示的にそのディレクトリのファイル記述子に対しても fsync() する必要がある。

fdatasync() は fsync() と同様であるが、メタデータの扱いが異なる。 fdatasync() は、それ以降のデータ読み込みを正しく扱うためにそのメタデータが必要に ならない限り、変更されたメタデータをフラッシュしない。 例えば、 st_atime や st_mtime (それぞれ最終アクセス時刻、最終修正時刻; stat(2) 参照) の変更はフラッシュを必要としない。 なぜならこれらはそれ以降のデータ読み込みを正しく扱うために 必要ではないからである。 一方、ファイルサイズ (ftruncate(2) では st_size) の変更はメタデータのフラッシュが必要である。

fdatasync() の狙いは、全てのメタデータをディスクと同期する必要のない アプリケーションに対して、ディスクアクセスを減らすことである。

返り値

成功した場合、これらのシステムコールはゼロを返す。 エラーの場合、-1 が返され、 errno が適切に設定される。

エラー

EBADF
fd が有効なオープンされたディスクリプタでない。
EIO
同期操作の間にエラーが発生した。
EROFS, EINVAL
fd が同期操作をサポートしてない特殊なファイルを参照している。

準拠

4.3BSD, POSIX.1-2001.

可用性

fdatasync() が利用可能な POSIX システムでは、 _POSIX_SYNCHRONIZED_IO<unistd.h> で 0 より大きな値に定義される (sysconf(3) 参照)。

注意

(Linux はそうではないが) いくつかの UNIX システムでは fd書き込み可能なファイルディスクリプタでなければならない。

Linux 2.2 以前では、 fdatasync() は fsync() と等価であり、性能面でのメリットはない。

古いカーネルやあまり使われていないファイルシステムの fsync() の実装では、 ディスクキャッシュをフラッシュする方法が分からない場合がある。そのような場合 には、安全に操作が行われることを保証するため、hdparm(8) や sdparm(8) を 使ってディスクキャッシュを無効にする必要がある。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。