Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all
名前
posix_fadvise - ファイルデータのアクセスパターンをあらかじめ宣言する
書式
#include <fcntl.h> int posix_fadvise(int fd, off_t offset, off_t len, int advice); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): posix_fadvise(): _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
説明
プログラムは、将来特定のパターンでファイルデータに アクセスする意思を伝えるために posix_fadvise() を使うことができる。 これにより、カーネルが適切な最適化を実行することが可 能になる。 advice は fd が参照しているファイルの offset から始まる len バイ トの範囲内 (len が 0 の場 合はファイルの終りまで) の (必ずしも存在しない) 領域に適用される。 advice は義務づけではな い。 advice は単にアプリケー ションのために可能性を構成するだけである。 advice に許される値には、以下のものが含まれる: POSIX_FADV_NORMAL 指定されたデータのアクセスパターンを指示するアドバイスを アプリケーションが何も持っ ていないことを示す。 オープンされたファイルにアドバイスが指定されない場合、 これが デフォルトで仮定される。 POSIX_FADV_SEQUENTIAL アプリケーションは指定されたデータがシーケンシャルに (大きなオフセットの前に小さな オフセットのデータを読むように) アクセスされることを期待する。 POSIX_FADV_RANDOM 指定されたデータがランダムな順番でアクセスされる。 POSIX_FADV_NOREUSE 指定されたデータは 1 度しかアクセスされない。 POSIX_FADV_WILLNEED 指定されたデータは近い将来アクセスされる。 POSIX_FADV_DONTNEED 指定されたデータは近い将来アクセスされない。
返り値
成功した場合は 0 が返される。 失敗した場合はエラー番号が返される。
エラー
EBADF fd 引き数が有効なファイルディスクリプタでない。 EINVAL 無効な値が advice に指定された。 ESPIPE 指定されたファイルディスクリプタがパイプまたは FIFO を参照している (この場合、Linux は実際には EINVAL を返す)。
バージョン
カーネルによるサポートは Linux 2.5.60 で最初に登場し、 対応するシステムコールは fadvise64() という名前である。 ライブラリによるサポートは glibc バージョン 2.2 以降で提供 されており、 ラッパー関数は posix_fadvise() という名前である。
準拠
POSIX.1-2001. len 引き数の型が POSIX.1-2003 TC1 において size_t から off_t に変更された点 に注意すること。
注意
Linux では、POSIX_FADV_NORMAL はバッキングデバイスの デフォルトサイズに先読み (readahead) ウインドウを設定する。 POSIX_FADV_SEQUENTIAL はこのサイズを 2 倍し、 POSIX_FADV_RANDOM は 先読みを全く無効にする。 これらの変更はファイル全体に影響し、指定された領域のみに影響する わけではない (しかし同じファイルに対する他のオープンファイルハンドルは影響を受けない)。 POSIX_FADV_WILLNEED は、 ページキャッシュに指定領域のブロックされない読み込みを開始する。 読み込まれるデータの総量は、 仮想メモリの負荷に依ってカーネルが減らすかもしれない (数メガ バイトであれば通常は全く十分であり、 それより多くてもめったに役に立たない)。 2.6.18 より前のカーネルでは、POSIX_FADV_NOREUSE は POSIX_FADV_WILLNEED と同じ意味であっ た。 これは多分バグであった。 カーネル 2.6.18 以降では、このフラグは何も行わない。 POSIX_FADV_DONTNEED は指定された領域に関連付けられた キャッシュページを解放しようとする。 例えば、これは大きなファイルをストリーミングするときに役立つ。 プログラムは、使用済みの キャッシュされたデータを解放するように、 定期的にカーネルに要求するかもしれない。 そうする ことにより、さらに有効なキャッシュされたページが、 代わりに破棄されることはない。 まだ書き出されていないページは影響を受けないので、 そのページの解放が保証されることをアプ リケーションが望んでいるなら、 最初に fsync(2) または fdatasync(2) を呼ぶべきである。 アーキテクチャ固有の派生バージョン いくつかのアーキテクチャでは、 64 ビットの引き数は適切なレジスタの組に割り当てる必要がある (syscall(2) 参照)。 このようなアーキテクチャでは、 「書式」に書かれている posix_fadvise() の呼び出しシグネチャーで、 引き数 fd と offset の間のパディング (詰めもの) でレジスタが一 つ消費されてしまう。 そのため、 これらのアーキテクチャでは引き数が適切な順序になった別のシ ステムコールが定義されているが、 それ以外は posix_fadvise() と全く同じである。 例えば、 Linux 2.6.14 以降では、 ARM には以下のシステムコールが存在する。 long arm_fadvise64_64(int fd, int advice, loff_t offset, loff_t len); 通常、 glibc の posix_fadvise() ラッパー関数により、 これらのアーキテクチャ固有の詳細はア プリケーションには見えない。 glibc のラッパー関数では、適切なアーキテクチャ固有のシステム コールが呼び出される。
バグ
2.6.6 より前のカーネルでは、 len に 0 が指定された場合、 「ファイルの終りまでの全てのバイ ト」という意味ではなく、 文字通り「0 バイト」として解釈されていた。
関連項目
readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。