当前位置:首页>Linux>posix_fadvise(2) - Linux 手册页

posix_fadvise(2) - Linux 手册页

  • 2026-09-02 19:08:35
posix_fadvise(2) - Linux 手册页

posix_fadvise(2) — Linux manual page

名称

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 下:

  • POSIX_FADV_NORMAL 将预读窗口大小设置为后备设备的默认大小。
  • POSIX_FADV_SEQUENTIAL 将此大小加倍。
  • POSIX_FADV_RANDOM 完全禁用文件预读。
  • POSIX_FADV_NOREUSE 不修改预读窗口大小。

这些修改会影响整个文件,而不仅是指定的区域(但指向同一文件的其他打开文件句柄不受影响)。

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)

Src

https://man7.org/linux/man-pages/man2/posix_fadvise.2.html

最新文章

随机文章