文件提示

普通文件I/O提示

Linux提供了两个接口,可以给出提示信息:posix_fadvise()和readahead()

posix_fadvise()

正如他的名字那样,posix_fadvise()函数可以给出提示信息

1
2
#include <fcntl.h>
int posix_fadvise (int fd, off_t offset, off_t len, int advice);

调用posix_fadvise()会向内核提供在文件fd的[offset, offset+len)区间内的操作提示。如果len为0,则会适用于区间[offset, length of file]。最常见的用法是设置len和offset为0,使得提示可以应用于整个文件

advice的可用选项和madvise()类似,必须是以下值之一:

POSIX_FADV_NORMAL 对指定的内存区域,应用没有特殊提示,按正常方式操作

POSIX_FADV_RANDOM 应用将以随机访问方式,访问指定范围的页

POSIX_FADV_SEQUENTIAL 应用期望从低地址到高地址顺序访问指定范围的页

POSIX_FADV_WILLNEED 应用期望会很快访问指定范围的页

POSIX_FADV_DONTNEED 应用在短期内不会访问指定范围内的页

成功时返回0,失败返回-1,并设置errno为下值之一:

EBADF 文件描述符非法

EINVAL 参数advice非法,文件描述符指向一个管道,或者设置的选项无法应用到指定的文件

readahead()

posix_fadvise()是在Linux内核2.6中新加入的系统调用。在此之前,readahead()可以完成和posix_fadvise()使用POSIX_FADV_WILLNEED选项同样的功能。和posix_fadvise()不同的是,readahead()是Linux所特有的

1
2
3
4
#define _GNU_SOURCE
#include <fcntl.h>

ssize_t readahead (int fd, off64_t offset, size_t count);

readahead()调用把fd所表示文件的映射区域[offset, offset+count)读到页缓存中

成功时返回0,失败返回-1,并设置errno为下值之一:

EBADF 文件描述符非法

EINVAL 文件描述符对应的文件不支持预读


文件提示
https://carl-5535.github.io/2021/03/21/Linux系统编程/文件提示/
作者
Carl Chen
发布于
2021年3月21日
许可协议