other versions
POSIX_FADVISE(2) | Linux Programmer's Manual | POSIX_FADVISE(2) |
名前¶
posix_fadvise - ファイルデータのアクセスパターンをあらかじめ宣言する書式¶
#include <fcntl.h>int posix_fadvise(int fd, off_t offset, off_t len, int advice);
glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
_XOPEN_SOURCE >= 600 ||
_POSIX_C_SOURCE >= 200112L
説明¶
プログラムは、将来特定のパターンでファイルデータに アクセスする意思を伝えるために posix_fadvise() を使うことができる。 これにより、カーネルが適切な最適化を実行することが可能になる。- 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 は先読みを全く無効にする。 これらの変更はファイル全体に影響し、指定された領域のみに影響するわけではない (しかし同じファイルに対する他のオープンファイルハンドルは影響を受けない)。arm_fadvise()¶
ARM アーキテクチャでは、64 ビットの引き数は適切なレジスタの組に割り当て る必要がある。このアーキテクチャでは、 posix_fadvise() の呼び出し方に は欠陥があり、それはこのシステムコールでは引き数 fd と len の間の パディング (詰めもの) でレジスタが一つ消費されてしまうというものである。 そのため、Linux 2.6.14 以降では、ARM では引き数が適切な順序になった別の システムコールが定義されている。long arm_fadvise64_64(int fd, int advice, loff_t offset, loff_t len);
上記の点以外は、このシステムコールの動作は 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.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2010-10-09 | Linux |