posix_fadvise - 预声明文件数据的访问模式
标准 C 库 (libc, -lc)
#include <fcntl.h>int posix_fadvise(int fd, off_t offset, off_t size, int advice);glibc 功能测试宏要求 (详见 feature_test_macros(7)): posix_fadvise(): _POSIX_C_SOURCE >= 200112L程序可以使用 posix_fadvise() 来声明未来将以特定模式访问文件数据的意向,从而使内核能够执行相应的优化。
此建议适用于文件描述符 fd 所引用的文件中,从 offset 开始、延伸 size 个字节(若 size 为 0 则直到文件末尾)的一个区域(该区域不一定存在)。该建议不具有约束力;它仅代表应用程序的预期。
advice 参数允许的值包括:
POSIX_FADV_NORMAL
表示应用程序对指定数据的访问模式没有建议。如果对已打开的文件未给出任何建议,这是默认假设。
POSIX_FADV_SEQUENTIAL
应用程序预计将顺序访问指定的数据(先读取较低偏移量,再读取较高偏移量)。
POSIX_FADV_RANDOM
指定的数据将被随机顺序访问。
POSIX_FADV_NOREUSE
指定的数据将仅被访问一次。
在 Linux 2.6.18 之前,POSIX_FADV_NOREUSE 与 POSIX_FADV_WILLNEED 具有相同的语义。这可能是一个错误;从 Linux 2.6.18 直到 Linux 6.2,此标志是一个空操作。自 Linux 6.3 起,POSIX_FADV_NOREUSE 表示内核页面置换算法可以忽略标记有此标志的映射页缓存的访问。例如,这在流式传输大文件时很有用。
POSIX_FADV_WILLNEED
指定的数据将在不久的将来被访问。
POSIX_FADV_WILLNEED 会启动一个非阻塞读操作,将指定区域读入页缓存。内核可能会根据虚拟内存负载减少读取的数据量。(通常能满足几兆字节的请求,超过此量很少有用。)
POSIX_FADV_DONTNEED
指定的数据在不久的将来不会被访问。
POSIX_FADV_DONTNEED 尝试释放与指定区域关联的缓存页面。例如,这在流式传输大文件时很有用。程序可以周期性地请求内核释放已使用过的缓存数据,从而避免更重要的缓存页面被丢弃。
丢弃部分页面的请求会被忽略。保留需要的数据优先于丢弃不需要的数据。如果应用程序要求数据被考虑丢弃,则 offset 和 size 必须是页对齐的。
实现可能会尝试写回指定区域中的脏页面,但这并不能保证。任何未写入的脏页面将不会被释放。如果应用程序希望确保脏页面被释放,应首先调用 fsync(2) 或 fdatasync(2)。
成功时返回 0。出错时,返回一个错误号。
EBADF 参数 fd 不是一个有效的文件描述符。
EINVAL 为 advice 参数指定了无效值。
ESPIPE 指定的文件描述符指向管道或 FIFO。(POSIX 规定返回此错误,但在 Linux 2.6.16 之前,Linux 在此情况下返回 EINVAL。)
在 Linux 下:
这些修改会影响整个文件,而不仅是指定的区域(但指向同一文件的其他打开文件句柄不受影响)。
C 库/内核差异
C 库中的封装函数名为 posix_fadvise()。底层系统调用名为 fadvise64()(在某些体系结构上为 fadvise64_64());两者之间的区别在于,前者系统调用假定 size 参数的类型为 size_t,而后者期望 loff_t。
特定体系结构变体
某些体系结构要求 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 size);
这些特定于体系结构的细节通常由 glibc 的 posix_fadvise() 封装函数隐藏,该函数会调用适当的特定体系结构系统调用。
POSIX.1-2024。
POSIX.1-2001。
内核支持首次出现在 Linux 2.5.60 中;底层系统调用名为 fadvise64()。库支持自 glibc 2.2 起通过封装函数 posix_fadvise() 提供。
自 Linux 3.18 起,对底层系统调用的支持是可选的,取决于 CONFIG_ADVISE_SYSCALLS 配置选项的设置。
在 POSIX.1-2001 TC1 中,size 参数的类型从 size_t 更改为 off_t。
内核缓冲区缓存的内容可以通过 proc(5) 中描述的 /proc/sys/vm/drop_caches 接口清空。
可以通过打开文件、使用 mmap(2) 映射它,然后对映射应用 mincore(2) 来获取文件哪些页面驻留在缓冲区缓存中的快照。
在 Linux 2.6.6 之前,如果将 size 指定为 0,则会被字面解释为“零字节”,而不是“直到文件末尾的所有字节”。
fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)
本页面是 man-pages(Linux 内核和 C 库用户空间接口文档)项目的一部分。有关该项目的信息可以在 ⟨https://www.kernel.org/doc/man-pages/⟩ 找到。如果您对本手册页有错误报告,请参见 ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩。
本页面来自 2026-01-16 从 ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ 获取的 tarball 包 man-pages-6.16.tar.gz。
如果您在此 HTML 版本的页面中发现任何渲染问题,或您认为有更好或更及时的页面来源,或您对页尾说明中的信息(这不是原始手册页的一部分)有更正或改进,请发送邮件至 man-pages@man7.org。
Linux man-pages 6.16 2025-10-29 posix_fadvise(2)
https://man7.org/linux/man-pages/man2/posix_fadvise.2.html