EN JA
POSIX_FADVISE(2)
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) 参照):
 
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 を参照している (この場合、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_NOREUSEPOSIX_FADV_WILLNEED と同じ意味であった。これは多分バグであった。カーネル 2.6.18 以降では、このフラグは何も行わない。
 
POSIX_FADV_DONTNEED は指定された領域に関連付けられたキャッシュページを解放しようとする。例えば、これは大きなファイルをストリーミングするときに役立つ。プログラムは、使用済みのキャッシュされたデータを解放するように、定期的にカーネルに要求するかもしれない。そうすることにより、さらに有効なキャッシュされたページが、代わりに破棄されることはない。
 
まだ書き出されていないページは影響を受けないので、そのページの解放が保証されることをアプリケーションが望んでいるなら、最初に fsync(2) または fdatasync(2) を呼ぶべきである。

Architecture-specific variants

Some architectures require 64-bit arguments to be aligned in a suitable pair of registers (see syscall(2) for further detail). On such architectures, the call signature of posix_fadvise() shown in the SYNOPSIS would force a register to be wasted as padding between the fd and len arguments. Therefore, these architectures define a version of the system call that orders the arguments suitably, but otherwise is otherwise exactly the same as posix_fadvise().
 
For example, since Linux 2.6.14, ARM has the following system call:



long arm_fadvise64_64(int fd, int advice,
loff_t offset, loff_t len);

These architecture-specific details are generally hidden from applications by the glibc posix_fadvise() wrapper function, which invokes the appropriate architecture-specific system call.

バグ

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

関連項目

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

この文書について

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