Provided by: manpages-ja-dev_0.5.0.0.20221215+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():
           _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 度しかアクセスされない。

              2.6.18 より前のカーネルでは、POSIX_FADV_NOREUSEPOSIX_FADV_WILLNEED と同じ意味で
              あった。  これは多分バグであった。 カーネル 2.6.18 以降では、このフラグは何も行わな
              い。

       POSIX_FADV_WILLNEED
              指定されたデータは近い将来アクセスされる。

              POSIX_FADV_WILLNEED は、 ページキャッシュに指定領域のブロックされない読み込みを開始
              する。  読み込まれるデータの総量は、 仮想メモリーの負荷に依ってカーネルが減らすかも
              しれない (数メガバイトであれば通常は全く十分であり、 それより多くてもめったに役に立
              たない)。

       POSIX_FADV_DONTNEED
              指定されたデータは近い将来アクセスされない。

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

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

              The  implementation  may attempt to write back dirty pages in the specified region,
              but this is not guaranteed.  Any unwritten dirty pages will not be freed.   If  the
              application  wishes  to  ensure  that  dirty pages will be released, it should call
              fsync(2)  or fdatasync(2)  first.

返り値

       成功した場合は 0 が返される。 失敗した場合はエラー番号が返される。

エラー

       EBADF  fd 引数が有効なファイルディスクリプターでない。

       EINVAL 無効な値が advice に指定された。

       ESPIPE 指定されたファイルディスクリプターがパイプまたは  FIFO  を参照している  (ESPIPE  は
              POSIX  で規定されているエラーだが、 バージョン 2.6.16 より前のカーネルでは、 この場
              合に EINVAL を返していた。)

バージョン

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

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

準拠

       POSIX.1-2001, POSIX.1-2008.  len 引数の型が POSIX.1-2001 TC1 において size_t から off_t に
       変更された点に注意すること。

注意

       Linux では、POSIX_FADV_NORMAL はバッキングデバイスの デフォルトサイズに先読み  (readahead)
       ウインドウを設定する。  POSIX_FADV_SEQUENTIAL はこのサイズを 2 倍し、 POSIX_FADV_RANDOM は
       先読みを全く無効にする。  これらの変更はファイル全体に影響し、指定された領域のみに影響する
       わけではない (しかし同じファイルに対する他のオープンファイルハンドルは影響を受けない)。

       The  contents  of  the kernel buffer cache can be cleared via the /proc/sys/vm/drop_caches
       interface described in proc(5).

       One can obtain a snapshot of which pages of a file are resident in  the  buffer  cache  by
       opening a file, mapping it with mmap(2), and then applying mincore(2)  to the mapping.

   C ライブラリとカーネルの違い
       The  name  of  the  wrapper  function in the C library is posix_fadvise().  The underlying
       system call is called  fadvise64()   (or,  on  some  architectures,  fadvise64_64());  the
       difference between the two is that the former system call assumes that the type of the len
       argument is size_t, while the latter expects loff_t there.

   アーキテクチャー固有の派生バージョン
       いくつかのアーキテクチャーでは、 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 バイト」として解釈されていた。

関連項目

       fincore(1),    mincore(2),    readahead(2),    sync_file_range(2),     posix_fallocate(3),
       posix_madvise(3)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。