LSEEK(2)

NOM
lseek - Positionner la tête de lecture/écriture dans un fichier

SYNOPSIS
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

DESCRIPTION
lseek() repositions the file offset of the open file description associated with the file descriptor fd to the argument offset according to the directive whence as follows:

SEEK_SET
    The file offset is set to offset bytes.

SEEK_CUR
    The file offset is set to its current location plus offset bytes.

SEEK_END
    The file offset is set to the size of the file plus offset bytes.

lseek() allows the file offset to be set beyond the end of the file (but this does not change the size of the file). If data is later written at this point, subsequent reads of the data in the gap (a "hole") return null bytes ('\0') until data is actually written into the gap.

  Recherche de données et trous de fichiers
Depuis la version 3.1, Linux accepte de plus les valeurs suivantes de whence :

SEEK_DATA
    Positionner la tête sur le prochain (supérieur ou égal à offset) emplacement du fichier contenant des données. Si offset pointe sur des données, la tête est placée sur offset.

SEEK_HOLE
    Positionner la tête sur le prochain (supérieur ou égal à offset) trou du fichier. Si offset pointe au milieu d'un trou, la tête est placée sur offset. S'il n'y a pas de trou après offset, la tête est positionnée à la fin du fichier (c'est-à-dire qu'il y a un trou implicite à la fin de tous les fichiers).

Dans les deux cas précédents, lseek() échoue si offset pointe après la fin du fichier.

Ces opérations permettent aux applications d'établir une projection des trous dans un fichier fractionné. Cela peut servir aux applications du type outils de sauvegarde, qui peuvent économiser de l'espace lors de la création de sauvegardes et conserver les trous, si elles disposent d'un mécanisme permettant de trouver les trous.

Pour ces opérations, un trou est une suite de zéros qui n'a (normalement) pas été allouée au stockage sous-jacent du fichier. Cependant, un système de fichiers n'est pas forcé de signaler les trous, donc ces opérations ne permettent pas de garantir la projection de l'espace de stockage vraiment alloué à un fichier (de plus, une suite de zéros vraiment écrite sur le stockage sous-jacent pourrait ne pas être signalée comme un trou). La plus simple implémentation de ses opérations pour un système de fichier, serait avec SEEK_HOLE renvoyant toujours la position de fin de fichier, et SEEK_DATA renvoyant toujours offset (c'est-à-dire, même si offset pointe à l'emplacement d'un trou, la suite de zéros peut être considérée comme des données).

La macro de test de fonctionnalités _GNU_SOURCE doit être définie pour accéder aux définitions de SEEK_DATA et SEEK_HOLE depuis <unistd.h>.

Les opérations SEEK_HOLE et SEEK_DATA sont prises en charge avec les systèmes de fichiers suivants :

*   Btrfs (depuis Linux 3.1)

*   OCFS (depuis Linux 3.2)

*   XFS (depuis Linux 3.5)

*   ext4 (depuis Linux 3.8)

*   tmpfs(5) (since Linux 3.8)

*   NFS (since Linux 3.18)

*   FUSE (since Linux 4.5)

*   GFS2 (since Linux 4.15)

VALEUR RENVOYÉE
lseek(), si elle réussit, renvoie le nouvel emplacement, mesuré en octets depuis le début du fichier. En cas d'échec, la valeur (off_t) -1 est renvoyée, et errno contient le code d'erreur.

ERREURS

EBADF
    fd n'est pas un descripteur de fichier ouvert.

EINVAL
    Soit whence n'est pas valable, soit la position demandée serait négative, ou après la fin d'un périphérique.

ENXIO
    whence is SEEK_DATA or SEEK_HOLE, and offset is beyond the end of the file, or whence is SEEK_DATA and offset is within a hole at the end of the file.

EOVERFLOW
    La position résultante dans le fichier ne peut être représentée dans un off_t.

ESPIPE
    fd est associé à un tube (pipe), une socket, ou une file FIFO.

CONFORMITÉ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

SEEK_DATA et SEEK_HOLE sont des extensions non normalisées existant aussi sous Solaris, FreeBSD et DragonFly BSD. Leur intégration est proposée pour la prochaine révision de POSIX (Issue 8).

NOTES
Consultez open(2) pour en savoir plus sur la relation entre les descripteurs de fichiers, les descriptions de fichiers ouverts et les fichiers.

If the O_APPEND file status flag is set on the open file description, then a write(2) always moves the file offset to the end of the file, regardless of the use of lseek().

The off_t data type is a signed integer data type specified by POSIX.1.

Certains périphériques ne permettent pas de positionnement direct, POSIX ne précise quels périphériques doivent gérer lseek().

On Linux, using lseek() on a terminal device fails with the error ESPIPE.

VOIR AUSSI
dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(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>, David Prévot <david@tilapin.org> et Frédéric Hantrais <fhantrais@gmail.com> 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>.