kazmax - Linux で自宅サーバー

posix_fadvise - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 注意
  7. 準拠
  8. バグ
  9. 関連項目

名前

posix_fadvise - ファイルデータのアクセスパターンをあらかじめ宣言する

書式

#define _XOPEN_SOURCE 600#include <fcntl.h>

int posix_fadvise(int fd, off_t offset, off_t len, int advice);

説明

プログラムは、将来特定のパターンでファイルデータに アクセスする意思を伝えるために posix_fadvise () を使うことができる。 これにより、カーネルが適切な最適化を実行することが可能になる。
advicefd が参照しているファイルの offset から始まる len バイトの範囲内 (len が 0 の場合はファイルの終りまで) の (必ずしも存在しない) 領域に適用される。 アドバイスは義務づけではない。 アドバイスは単にアプリケーションのために可能性を構成するだけである。
advice に許される値には、以下のものが含まれる:

POSIX_FADV_NORMAL
指定されたデータのアクセスパターンを指示するアドバイスを アプリケーションが何も持っていないことを示す。 オープンされたファイルにアドバイスが指定されない場合、 これがデフォルトで仮定される。
POSIX_FADV_SEQUENTIAL
アプリケーションは指定されたデータがシーケンシャルに (大きなオフセットの前に小さなオフセットのデータを読むように) アクセスされることを期待する。
POSIX_FADV_RANDOM
指定されたデータがランダムな順番でアクセスされる。
POSIX_FADV_NOREUSE
指定されたデータは 1 度しかアクセスされない。
POSIX_FADV_WILLNEED
指定されたデータは近い将来アクセスされる。
POSIX_FADV_DONTNEED
指定されたデータは近い将来アクセスされない。

返り値

成功した場合は 0 が返される。 失敗した場合は -1 が返され、errno が適切に設定される。

エラー

EBADF
fd 引き数が有効なファイルディスクリプタでない。
EINVAL
無効な値が advice に指定された。
ESPIPE
指定されたファイルディスクリプタがパイプまたは FIFO を参照している (この場合、Linux は実際には EINVAL を返す)。

注意

posix_fadvise ()はカーネル 2.5.60 で登場した。
Linux では、POSIX_FADV_NORMAL はバッキングデバイスの デフォルトサイズに先読み (readahead) ウインドウを設定する。 POSIX_FADV_SEQUENTIAL はこのサイズを 2 倍し、 POSIX_FADV_RANDOM は先読みを全く無効にする。 これらの変更はファイル全体に影響し、指定された領域のみに影響するわけではない (しかし同じファイルに対する他のオープンファイルハンドルは影響を受けない)。
POSIX_FADV_WILLNEEDPOSIX_FADV_NOREUSE は、 どちらもページキャッシュに指定領域のブロックされない読み込みを開始する。 読み込まれるデータの総量は、VM の負荷に依ってカーネルが減らすかもしれない (数メガバイトであれば通常は全く十分であり、 それより多くてもめったに役に立たない)。
POSIX_FADV_DONTNEED は指定された領域に関連付けられた キャッシュページを解放しようとする。 例えば、これは大きなファイルをストリーミングするときに役立つ。 プログラムは、使用済みのキャッシュされたデータを解放するように、 定期的にカーネルに要求するかもしれない。 そうすることにより、さらに有効なキャッシュされたページが、 代わりに破棄されることはない。
まだ書き出されていないページは影響を受けないので、 そのページの解放が保証されることをアプリケーションが望んでいるなら、 最初に fsync () または fdatasync () を呼ぶべきである。

準拠

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

バグ

2.6.6 より前のカーネルでは、 len に 0 が指定された場合、 「ファイルの終りまでの全てのバイト」という意味ではなく、 文字通り「0 バイト」として解釈されていた。

関連項目

posix_madvise (2),  readahead (2),  posix_fallocate (3)