POSIX_FADVISE(2)

NOM
posix_fadvise - Prédéclarer des accès aux données d'un fichier

SYNOPSIS
#include <fcntl.h>

int posix_fadvise(int fd, off_t offset, off_t len, int advice);

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :

posix_fadvise() :
    _POSIX_C_SOURCE >= 200112L

DESCRIPTION
Les programmes peuvent utiliser posix_fadvise() pour annoncer leur intention d'accéder aux données d'un fichier suivant un certain ordre, permettant ainsi au noyau de réaliser les optimisations appropriées.

L'indication advice s'applique à une région (pas nécessairement existante) débutant à offset et s'étendant sur len octets (ou jusqu'à la fin du fichier si len vaut zéro) dans le fichier référencé par fd. L'indication advice n'oblige à rien, il s'agit seulement d'une supposition concernant le comportement futur de l'application.

Les valeurs possibles pour advice incluent :

POSIX_FADV_NORMAL
    Indique que l'application n'a pas d'indice particulier concernant les accès aux données du fichier. Le noyau appliquera son comportement par défaut.

POSIX_FADV_SEQUENTIAL
    L'application pense accéder aux données séquentiellement (dans l'ordre des offsets croissants).

POSIX_FADV_RANDOM
    Les accès se feront de manière aléatoire.

POSIX_FADV_NOREUSE
    Les données ne seront accédées qu'une seule fois.

    Sous les noyaux antérieurs à 2.6.18, POSIX_FADV_NOREUSE avait la même sémantique que POSIX_FADV_WILLNEED. Il s'agissait sans doute d'un bogue ; depuis Linux 2.6.18, cet attribut n'a aucun effet.

POSIX_FADV_WILLNEED
    Les données seront accédées dans le futur proche.

    POSIX_FADV_WILLNEED initie une lecture non bloquante de la région indiquée dans le cache. La quantité de données lues peut être diminuée suivant la charge mémoire (quelques mégaoctets seront en général disponibles et souvent suffisants).

POSIX_FADV_DONTNEED
    Les données ne seront pas accédées dans le futur proche.

    POSIX_FADV_DONTNEED essaye de libérer les pages de cache associées avec la région indiquée. Ceci est utile par exemple lors du parcours de très gros fichiers. Un programme peut ainsi demander régulièrement au noyau de libérer les pages déjà utilisées, pour éviter que des pages plus utiles ne soient éliminées à leur place.

    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 offset and len must be page-aligned.

    The implementation may attempt 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.

VALEUR RENVOYÉE
L'appel renvoie zéro s'il réussit. S'il échoue, il renvoie un code d'erreur.

ERREURS

EBADF
    L'argument fd n'est pas un descripteur de fichier valable.

EINVAL
    L'indication advice est invalide.

ESPIPE
    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.)

VERSIONS
La prise en charge par le noyau est d'abord apparue dans Linux 2.5.60 ; l'appel système sous-jacent est appelé fadvise64(). La prise en charge dans l'espace utilisateur est disponible depuis la glibc 2.2, à travers la fonction posix_fadvise().

Since Linux 3.18, support for the underlying system call is optional, depending on the setting of the CONFIG_ADVISE_SYSCALLS configuration option.

CONFORMITÉ
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-2001 TC1.

NOTES
Sous Linux, POSIX_FADV_NORMAL configure la fenêtre de lecture anticipée à sa taille par défaut pour le périphérique concerné. POSIX_FADV_SEQUENTIAL double cette taille, et POSIX_FADV_RANDOM désactive la lecture anticipée. Ces modifications affectent le fichier entier, pas seulement la région indiquée (mais les autres descripteurs ouverts sur le même fichier ne sont pas modifiés).

The contents of the kernel buffer cache can be cleared via the /proc/sys/vm/drop_caches interface described in proc(5).

One can obtain a snapshot of which pages of a file are resident in the buffer cache by opening a file, mapping it with mmap(2), and then applying mincore(2) to the mapping.

  différences entre bibliothèque C et noyau
The name of the wrapper function in the C library is posix_fadvise(). The underlying system call is called fadvise64() (or, on some architectures, fadvise64_64()); the 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.

  Variantes dépendantes de l'architecture
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 between the fd and offset arguments. Therefore, these architectures define a version of the system call that orders the arguments suitably, but is otherwise exactly the same as posix_fadvise().

Par exemple, depuis Linux 2.6.14, l'architecture ARM utilise l'appel système suivant :

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

Ces détails dépendants de l'architecture sont généralement invisibles des applications grâce à la glibc et sa fonction d'enrobage posix_fadvise(), qui utilise l'appel système adapté à l'architecture.

BOGUES
Dans les noyaux antérieurs à 2.6.6, si le paramètre len était nul, la valeur était interprétée comme « zéro octets », et non comme « tous les octets jusqu'à la fin du fichier ».

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

COLOPHON
Cette page fait partie de la publication 5.08 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org> et David Prévot <david@tilapin.org> Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à <debian-l10n-french@lists.debian.org>.