bionic (2) posix_fadvise.2.gz

Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all bug

名前

       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()  を使う
       ことができる。 これにより、カーネルが適切な最適化を実行することが可能になる。

       advicefd が参照しているファイルの 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 を参照している (ESPIPE は POSIX で規定されて
              いるエラーだが、 バージョン 2.16 より前のカーネルでは、 この場合に EINVAL を返していた。)

バージョン

       カーネルによるサポートは  Linux 2.5.60 で最初に登場し、 対応するシステムコールは fadvise64() という名前で
       ある。   ライブラリによるサポートは   glibc   バージョン   2.2   以降で提供されており、    ラッパー関数は
       posix_fadvise() という名前である。

       Linux        3.18        以降では、対応するシステムコールのサポートは任意となり、利用できるかはカーネルが
       CONFIG_ADVISE_SYSCALLS オプションを有効にしてコンパイルされているかに依存する。

準拠

       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_NOREUSEPOSIX_FADV_WILLNEED と同じ意味であった。  これは多分バ
       グであった。 カーネル 2.6.18 以降では、このフラグは何も行わない。

       POSIX_FADV_DONTNEED  は指定された領域に関連付けられた キャッシュページを解放しようとする。 例えば、これは
       大きなファイルをストリーミングするときに役立つ。 プログラムは、使用済みのキャッシュされたデータを解放する
       ように、  定期的にカーネルに要求するかもしれない。 そうすることにより、さらに有効なキャッシュされたページ
       が、 代わりに破棄されることはない。

       ページの一部分の破棄要求は無視される。 不要なデータを破棄するよりも必要なデータを保持する方がよい。  アプ
       リケーションがデータを破棄した方がよいと思う場合は、  offsetlen がページ境界に合っていなければならな
       い。

       まだ書き出されていないページは影響を受けないので、 そのページの解放が保証されることをアプリケーションが望
       んでいるなら、 最初に fsync(2) または fdatasync(2)  を呼ぶべきである。

   アーキテクチャー固有の派生バージョン
       いくつかのアーキテクチャーでは、       64      ビットの引き数は適切なレジスターの組に割り当てる必要がある
       (syscall(2) 参照)。 このようなアーキテクチャーでは、 「書式」に書かれている  posix_fadvise() の呼び出しシ
       グネチャーで、  引き数 fdoffset の間のパディング (詰めもの) でレジスターが一つ消費されてしまう。 その
       ため、 これらのアーキテクチャーでは引き数が適切な順序になった別のシステムコールが定義されているが、  それ
       以外は 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.79 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。