Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_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(1)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。