POSIX_FADVISE - Linux手册页

时间:2019-08-20 17:59:07  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2019-03-06

名称

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()宣布将来打算以特定模式访问文件数据,从而允许内核执行适当的优化。

该建议适用于从fd引用的文件中的偏移量开始并延伸len个字节(或者如果len为0则直到文件末尾)的(不一定存在的)区域。该建议不具有约束力。它仅代表该应用程序的期望。

允许的建议值包括:

POSIX_FADV_NORMAL
指示该应用程序不建议给出其对指定数据的访问模式。如果没有建议打开文件,这是默认假设。
POSIX_FADV_SEQUENTIAL
该应用程序期望顺序访问指定的数据(先读取较低的偏移量,然后读取较高的偏移量)。
POSIX_FADV_RANDOM
指定的数据将以随机顺序访问。
POSIX_FADV_NOREUSE
指定的数据将仅被访问一次。
在2.6.18之前的内核中,POSIX_FADV_NOREUSE具有与POSIX_FADV_WILLNEED相同的语义。这可能是一个错误;从2.6.18内核开始,此标志为空。
POSIX_FADV_WILLNEED
指定的数据将在不久的将来访问。
POSIX_FADV_WILLNEED启动对页面缓存中指定区域的非阻塞读取。内核可以根据虚拟内存负载减少读取的数据量。 (通常将完全满足几兆字节的需求,而很少有用。)
POSIX_FADV_DONTNEED
指定的数据将在不久的将来不被访问。
POSIX_FADV_DONTNEED尝试释放与指定区域关联的缓存页面。例如,在流大文件时,这很有用。程序可能会定期请求内核释放已使用的缓存数据,以使更有用的缓存页面不会被丢弃。
丢弃部分页面的请求将被忽略。与丢弃不需要的数据相比,保留所需的数据更好。如果应用程序要求考虑将数据丢弃,则必须将offset和len页面对齐。
该实现可能会尝试写回指定区域中的脏页,但这不能保证。任何未写的脏页都不会被释放。如果应用程序希望确保将释放脏页,则应首先调用fsync(2)或fdatasync(2)。

返回值

成功时,返回零。出错时,返回错误号。

错误说明

EBADF
fd参数不是有效的文件描述符。
EINVAL
指定了无效的建议值。
ESPIPE
指定的文件描述符引用管道或FIFO。 (ESPIPE是POSIX指定的错误,但是在内核版本2.6.16之前,Linux在这种情况下返回EINVAL。)

版本

对内核的支持最早出现在Linux 2.5.60中。底层系统调用称为fadvise64()。从glibc 2.2版开始,通过包装函数posix_fadvise()提供了库支持。

从Linux 3.18开始,对底层系统调用的支持是可选的,具体取决于CONFIG_ADVISE_SYSCALLS配置选项的设置。

遵循规范

POSIX.1-2001,POSIX.1-2008。请注意,在POSIX.1-2001 TC1中,len参数的类型从size_t更改为off_t。

备注

在Linux下,POSIX_FADV_NORMAL将预读窗口设置为备用设备的默认大小; POSIX_FADV_SEQUENTIAL将该大小加倍,并且POSIX_FADV_RANDOM完全禁用文件预读。这些更改不仅会影响指定的区域,还会影响整个文件(但不会影响同一文件的其他打开文件句柄)。

可以通过proc(5)中描述的/ proc / sys / vm / drop_caches接口清除内核缓冲区高速缓存的内容。

通过打开文件,使用mmap(2)映射文件,然后将mincore(2)应用于映射,可以获取快照文件驻留在缓冲区高速缓存中的快照。

C library/kernel differences

C库中包装函数的名称为posix_fadvise()。底层系统调用称为fadvise64()(或在某些体系结构上为fadvise64_64());两者之间的区别在于,前者的系统调用假定len参数的类型为size_t,而后者的期望为loff_t。

Architecture-specific variants

某些体系结构要求将64位参数在一对合适的寄存器中对齐(有关更多详细信息,请参见syscall(2))。在这样的体系结构上,摘要中显示的posix_fadvise()的调用签名将迫使寄存器浪费为fd和offset参数之间的填充。因此,这些体系结构定义了系统调用的版本,该版本适当地对参数进行排序,但与posix_fadvise()完全相同。

例如,从Linux 2.6.14开始,ARM具有以下系统调用:

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

这些特定于体系结构的细节通常通过glibc posix_fadvise()包装函数对应用程序隐藏,该函数调用适当的特定于体系结构的系统调用。

BUGS

在2.6.6之前的内核中,如果将len指定为0,则将其字面解释为"零字节",而不是"从头到尾的所有字节"。

另外参见

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

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/