Section (2) posix_fadvise
posix_fadvise — predeclare an access pattern for file data
Programs can use
posix_fadvise() to announce an intention to
access file data in a specific pattern in the future, thus
allowing the kernel to perform appropriate optimizations.
to a (not necessarily existent) region starting at
offset and extending for
len bytes (or until
the end of the file if
len is 0) within the file
referred to by
advice is not
binding; it merely constitutes an expectation on behalf of
Permissible values for
Indicates that the application has no advice to give about its access pattern for the specified data. If no advice is given for an open file, this is the default assumption.
The application expects to access the specified data sequentially (with lower offsets read before higher ones).
The specified data will be accessed in random order.
The specified data will be accessed only once.
In kernels before 2.6.18,
POSIX_FADV_NOREUSEhad the same semantics as
POSIX_FADV_WILLNEED. This was probably a bug; since kernel 2.6.18, this flag is a no-op.
The specified data will be accessed in the near future.
POSIX_FADV_WILLNEEDinitiates a nonblocking read of the specified region into the page cache. The amount of data read may be decreased by the kernel depending on virtual memory load. (A few megabytes will usually be fully satisfied, and more is rarely useful.)
The specified data will not be accessed in the near future.
POSIX_FADV_DONTNEEDattempts to free cached pages associated with the specified region. This is useful, for example, while streaming large files. A program may periodically request the kernel to free cached data that has already been used, so that more useful cached pages are not discarded instead.
Requests to discard partial pages are ignored. It is preferable to preserve needed data than discard unneeded data. If the application requires that data be considered for discarding, then
lenmust be page-aligned.
mayattempt to write back dirty pages in the specified region, but this is not guaranteed. Any unwritten dirty pages will not be freed. If the application wishes to ensure that dirty pages will be released, it should call fsync(2) or fdatasync(2) first.
fdargument was not a valid file descriptor.
An invalid value was specified for
The specified file descriptor refers to a pipe or FIFO. (ESPIPE is the error specified by POSIX, but before kernel version 2.6.16, Linux returned EINVAL in this case.)
Kernel support first appeared in Linux 2.5.60; the
underlying system call is called
fadvise64(). Library support has been
provided since glibc version 2.2, via the wrapper function
Since Linux 3.18, support for the underlying system call
is optional, depending on the setting of the
POSIX.1-2001, POSIX.1-2008. Note that the type of the
len argument was
changed from size_t to off_t in POSIX.1-2003 TC1.
POSIX_FADV_NORMAL sets the readahead window
to the default size for the backing device;
POSIX_FADV_SEQUENTIAL doubles this size,
file readahead entirely. These changes affect the entire
file, not just the specified region (but other open file
handles to the same file are unaffected).
The contents of the kernel buffer cache can be cleared via
interface described in proc(5).
C library/kernel differences
The name of the wrapper function in the C library is
underlying system call is called
fadvise64() (or, on some architectures,
difference between the two is that the former system call
assumes that the type of the
len argument is size_t, while the latter expects loff_t there.
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
Therefore, these architectures define a version of the
system call that orders the arguments suitably, but is
otherwise exactly the same as
For example, since Linux 2.6.14, ARM has the following system call:
These architecture-specific details are generally hidden
from applications by the glibc
posix_fadvise() wrapper function, which
invokes the appropriate architecture-specific system
In kernels before 2.6.6, if
len was specified as 0, then
this was interpreted literally as zero bytes, rather than
as meaning all bytes through to the end of the file.
This page is part of release 5.04 of the Linux
man-pages project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
Copyright 2003 Abhijit Menon-Sen <amswiw.org>
and Copyright (C) 2010, 2015, 2017 Michael Kerrisk <mtk.manpagesgmail.com>
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Since the Linux kernel and libraries are constantly changing, this
manual page may be incorrect or out-of-date. The author(s) assume no
responsibility for errors or omissions, or for damages resulting from
the use of the information contained herein. The author(s) may not
have taken the same level of care in the production of this manual,
which is licensed free of charge, as they might when working
Formatted or processed versions of this manual, if unaccompanied by
the source, must acknowledge the copyright and authors of this work.
2005-04-08 mtk, noted kernel version and added BUGS
2010-10-09, mtk, document arm_fadvise64_64()