fsync - システムコールの説明 - Linux コマンド集 一覧表
名前
fsync - メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる
書式
#include <unistd.h>
int fsync(int
fd
);
int fdatasync(int
fd
);
説明
fsync
()はファイル記述子
fd
で参照されるファイルの、修正された内部で持っているデータ
(つまり、修正されたバッファキャッシュページ)を、
そのファイルが属するディスクデバイス(またはその他の永続ストレージデバイス)に
転送(「フラッシュ」)する。
この呼び出しは転送が終わったとデバイスが報告するまでブロックする。
またファイルに結びついたメタデータ情報(
stat
(2) 参照)もフラッシュする。
fsync
()の呼び出しは、ファイルが存在しているディレクトリのエントリがディスクへ
書き込まれたことを保証するわけではない。
保証するためには明示的にそのディレクトリのファイル記述子に対しても
fsync
()する必要がある。
fdatasync
()は
fsync
()と同様であるが、
引き続くデータ読み込みを正しく扱うためにそのメタデータが必要にならない限り、
変更されたメタデータをフラッシュしない。
例えば、
st_atime や st_mtime
(それぞれ最終アクセス時刻、最終修正時刻;
stat
(2) 参照) の変更はフラッシュを必要としない。
なぜならこれらは引き続くデータ読み込みを正しく扱うために
必要ではないからである。
一方、ファイルサイズ(
ftruncate
(2)では
st_size
)の変更はメタデータのフラッシュが必要である。
fdatasync
(2) の狙いは、全てのメタデータをディスクと同期する必要のない
アプリケーションに対して、ディスクアクセスを減らすことである。
返り値
成功した場合、ゼロが返される。エラーの場合、-1 が返され、 errno が適切に設定される。
エラー
- EBADF
- fd が書き込みのためにオープンされたファイル記述子でない。
- EIO
- 同期操作の間にエラーが発生した。
- EROFS , EINVAL
- fd が同期操作をサポートしてない特殊なファイルを参照している。
注意
基礎となるハードディスクの書き込みキャッシュが有効になっている場合、 fsync () / fdatasync ()から戻ってきたとしても、実際には永続的な記憶媒体に 置かれていないかもれない。
ext2 ファイル・システムが sync オプションつきでマウントされている場合、 fsync ()でディレクトリ・エントリも暗黙のうちに同期する。
2.4 より前のカーネルでは巨大なファイルに fsync ()を使用することは効率が悪い場合がある。 別の方法として open (2) の際に O_SYNC フラグを使用するのが良いかもしれない。
準拠
POSIX.1-2001
関連項目
bdflush
(2),
open
(2),
sync
(2),
sync_file_range
(2),
hdparm
(8),
mount
(8),
sync
(8),
update
(8)