FSYNC
Section: Linux Programmer's Manual (2)
Updated: 2007-07-26
Index
JM Home Page
roff page
名前
fsync - メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる
書式
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
glibc 向けの機能検査マクロの要件
(feature_test_macros(7)
参照):
fsync():
_BSD_SOURCE || _XOPEN_SOURCE
fdatasync():
_POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500
説明
fsync()
はファイル記述子
fd
で参照されるファイルの、修正された内部で持っているデータ
(つまり、修正されたバッファキャッシュページ) を、
そのファイルが属するディスクデバイス (またはその他の永続ストレージデバイス)
に転送 (「フラッシュ」) する。
この呼び出しは転送が終わったとデバイスが報告するまでブロックする。
またファイルに結びついたメタデータ情報
(stat(2)
参照) もフラッシュする。
fsync()
の呼び出しは、ファイルが存在しているディレクトリのエントリがディスクへ
書き込まれたことを保証するわけではない。
保証するためには明示的にそのディレクトリのファイル記述子に対しても
fsync()
する必要がある。
fdatasync()
は
fsync()
と同様であるが、
引き続くデータ読み込みを正しく扱うためにそのメタデータが必要にならない限り、
変更されたメタデータをフラッシュしない。
例えば、
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)
参照)。
注意
データベースやログファイルにアクセスするアプリケーションは、
非常に小さなデータの断片の書き込みを行い、その後すぐに
fsync()
を呼び出して、書き込んだデータがハードディスクに物理的に
確実に格納されるようにすることが多い。
残念ながら、
fsync()
は常に 2つの書き込み操作を開始する。
一つは新しく書き込まれたデータに対するものであり、
もう一つは inode に格納される修正時刻 (modification time) を
更新するためのものである。
修正時刻の更新が不可分な操作 (トランザクション) の一部ではない場合、
fdatasync()
を使うことで、不必要な inode のディスク書き込み操作を避けることができる。
基礎となるハードディスクの書き込みキャッシュが有効になっている場合、
fsync()
/
fdatasync()
から戻ってきたとしても、実際には永続的な記憶媒体に
置かれていないかもれない。
ext2 ファイル・システムが
sync
オプションつきでマウントされている場合、
fsync()
でディレクトリ・エントリも暗黙のうちに同期する。
2.4 より前のカーネルでは巨大なファイルに
fsync()
を使用することは効率が悪い場合がある。
別の方法として
open(2)
の際に
O_SYNC
フラグを使用するのが良いかもしれない。
Linux 2.2 以前では、
fdatasync()
は
fsync()
と等価であり、それゆえ性能面でのメリットはない。
関連項目
bdflush(2),
open(2),
sync(2),
sync_file_range(2),
hdparm(8),
mount(8),
sync(8),
update(8)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 可用性
-
- 注意
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:41 GMT, November 19, 2007