SYNC_FILE_RANGE(2) | Linux Programmer's Manual | SYNC_FILE_RANGE(2) |
sync_file_range - ファイルセグメントをディスクと同期する
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */ #include <fcntl.h> int sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned int flags);
sync_file_range() を使うと、ファイルディスクリプター fd で参照されるオープンされたファイルのディスクとの同期に関して、 きめ細かな制御が可能となる。
offset は、同期を行うファイルの領域の開始バイトである。 nbytes には同期を行う領域の長さをバイト単位で指定する。 nbytes が 0 の場合は、 offset からファイル末尾までの全バイトを同期する。 同期はシステムのページサイズの単位で行われる。 offset はページ境界にあわせて切り下げられ、 (offset+nbytes-1) はページ境界にあわせて切り上げられる。
ビットマスク引き数 flags には以下の値を指定することができる:
flags に 0 を指定した場合、何もしないことを表す。
このシステムコールは非常に危険であり、 移植性が必要なプログラムで使用すべきではない。 これらの操作ではどれもファイルのメタデータの書き出しを行わない。 したがって、アプリケーションにより作成済みのディスクブロックの 上書きの実行が確実に行われない限り、クラッシュの後でもデータが 利用できる保証はない。 書き込みが上書きだけであるかを知るためのユーザーインターフェースは存在しない。 (btrfs などの) copy-on-write 動作を使ったファイルシステムでは、 既存の割り当て済みのブロックに対する上書き自体ができない。 前もって割り当てられた領域に書き込みを行う場合、 多くのファイルシステムでは block allocator への書き込みも必要となるが、 このシステムコールは block allocator のディスクへの同期を行わない。 このシステムコールはディスク書き込みキャッシュのフラッシュを 行わないので、揮発性のディスク書き込みキャッシュを使ったシステムでは このシステムコールではデータの一貫性を確保できないことになる。
SYNC_FILE_RANGE_WAIT_BEFORE と SYNC_FILE_RANGE_WAIT_AFTER は I/O エラーや ENOSPC 状態を検出し、呼び出し元にこれらの情報を返す。
flags の役に立つビットの組み合わせを以下に示す:
成功の場合、 sync_file_range() は 0 を返す。失敗の場合、-1 を返し、 errno にエラーを示す値を設定する。
sync_file_range() はカーネル 2.6.17 で Linux に登場した。
このシステムコールは Linux 独自であり、 移植性が必要なプログラムでは使用を避けるべきである。
いくつかのアーキテクチャー (例えば、 PowerPC や ARM) では、 64 ビットの引き数は適切なレジスターの組に割り当てる必要がある。 このようなアーキテクチャーでは、 「書式」に書かれている sync_file_range() の呼び出しシグネチャーで、 引き数 fd と offset の間のパディング (詰めもの) でレジスターが一つ消費されてしまう (詳細は syscall(2) 参照)。 そのため、 これらのアーキテクチャーでは引き数が適切な順序になった別のシステムコールが定義されている。
int sync_file_range2(int fd, unsigned int flags, off64_t offset, off64_t nbytes);
上記の点以外は、このシステムコールの動作は sync_file_range() と 全く同じである。このシステムコールに対するライブラリによるサポートは glibc では提供されていない。
このバージョンのシステムコールは、Linux 2.6.20 で ARM アーキテクチャーで 初めて登場し、 arm_sync_file_range() という名前であった。 Linux 2.6.22 で、同様のシステムコールが PowerPC 用に追加された際に、 システムコールの名前が変更された。 glibc によるサポートが提供されているアーキテクチャーでは、 glibc のラッパー関数は sync_file_range() という名前で sync_file_range2() を適切に使用するようになっている。
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-08-19 | Linux |