fsyncのヘルプ・マニュアル
日本語 英語
fsync --help
man fsync
FSYNC(2) Linux Programmer’s Manual FSYNC(2)
名前
fsync - メモリ上にあるファイルの内容をストレージデバイス上のものと同期
させる
書式
#include
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 で参照されるファイルの内部で持っている デ
ー タ (つまりバッファキャッシュページ) のうち修正されたデータを、そのフ
ァイルが属するディスクデバイス (またはその他の永続ストレージデバ イ ス)
に 転送 (「フラッシュ」) する。この呼び出しは転送が終わったとデバイスが
報告するまでブロックする。またファイルに結びついた メ タ デ ー タ 情 報
(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 が
で 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)
Linux 2008-11-07 FSYNC(2)
FSYNC(2) Linux Programmer’s Manual FSYNC(2)
NAME
fsync, fdatasync - synchronize a file’s in-core state with storage
device
SYNOPSIS
#include
int fsync(int fd);
int fdatasync(int fd);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
fsync(): _BSD_SOURCE || _XOPEN_SOURCE
|| /* since glibc 2.8: */ _POSIX_C_SOURCE >= 200112L
fdatasync(): _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500
DESCRIPTION
fsync() transfers ("flushes") all modified in-core data of (i.e., modi-
fied buffer cache pages for) the file referred to by the file descrip-
tor fd to the disk device (or other permanent storage device) where
that file resides. The call blocks until the device reports that the
transfer has completed. It also flushes metadata information associ-
ated with the file (see stat(2)).
Calling fsync() does not necessarily ensure that the entry in the
directory containing the file has also reached disk. For that an
explicit fsync() on a file descriptor for the directory is also needed.
fdatasync() is similar to fsync(), but does not flush modified metadata
unless that metadata is needed in order to allow a subsequent data
retrieval to be correctly handled. For example, changes to st_atime or
st_mtime (respectively, time of last access and time of last modifica-
tion; see stat(2)) do not require flushing because they are not neces-
sary for a subsequent data read to be handled correctly. On the other
hand, a change to the file size (st_size, as made by say ftruncate(2)),
would require a metadata flush.
The aim of fdatasync() is to reduce disk activity for applications that
do not require all metadata to be synchronized with the disk.
RETURN VALUE
On success, these system calls return zero. On error, -1 is returned,
and errno is set appropriately.
ERRORS
EBADF fd is not a valid file descriptor open for writing.
EIO An error occurred during synchronization.
EROFS, EINVAL
fd is bound to a special file which does not support synchro-
nization.
CONFORMING TO
4.3BSD, POSIX.1-2001.
AVAILABILITY
On POSIX systems on which fdatasync() is available, _POSIX_SYNCHRO-
NIZED_IO is defined in to a value greater than 0. (See also
sysconf(3).)
NOTES
Applications that access databases or log files often write a tiny data
fragment (e.g., one line in a log file) and then call fsync() immedi-
ately in order to ensure that the written data is physically stored on
the harddisk. Unfortunately, fsync() will always initiate two write
operations: one for the newly written data and another one in order to
update the modification time stored in the inode. If the modification
time is not a part of the transaction concept fdatasync() can be used
to avoid unnecessary inode disk write operations.
If the underlying hard disk has write caching enabled, then the data
may not really be on permanent storage when fsync() / fdatasync()
return.
When an ext2 file system is mounted with the sync option, directory
entries are also implicitly synced by fsync().
On kernels before 2.4, fsync() on big files can be inefficient. An
alternative might be to use the O_SYNC flag to open(2).
In Linux 2.2 and earlier, fdatasync() is equivalent to fsync(), and so
has no performance advantage.
SEE ALSO
bdflush(2), open(2), sync(2), sync_file_range(2), hdparm(8), mount(8),
sync(8), update(8)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2008-11-07 FSYNC(2)