Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all 

名前
fsync - メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる
書式
#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) を 使ってディスクキャッシュを無効にする必要がある。
関連項目
bdflush(2), open(2), sync(2), sync_file_range(2), hdparm(8), mount(8), sync(8), update(8)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告
に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2012-02-27 FSYNC(2)