lseek(2) System Calls Manual lseek(2) NOM lseek - Positionner la tete de lecture/ecriture dans un fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include off_t lseek(int fd, off_t offset, int whence); DESCRIPTION lseek() replace la description du fichier ouvert associee au descripteur de fichier fd au parametre offset en suivant la directive whence ainsi : SEEK_SET La tete est placee a offset octets. SEEK_CUR La tete est placee a son emplacement actuel plus offset octets. SEEK_END La tete est placee a la taille du fichier plus offset octets. lseek() permet de placer la tete au-dela de la fin du fichier (mais cela ne modifie pas la taille du fichier). Si des donnees sont ecrites a cet emplacement, une lecture ulterieure de l'espace intermediaire (un << trou >>) retournera des octets NULL (<< \0 >>) jusqu'a ce que d'autres donnees y soient ecrites. Recherche de donnees et de trous de fichier Depuis Linux 3.1, Linux prend en charge les valeurs supplementaires suivantes de whence : SEEK_DATA Positionner la tete sur le prochain (superieur ou egal a offset) emplacement du fichier contenant des donnees. Si offset pointe sur des donnees, la tete est placee sur offset. SEEK_HOLE Positionner la tete sur le prochain (superieur ou egal a offset) trou du fichier. Si offset pointe au milieu d'un trou, la tete est placee sur offset. S'il n'y a pas de trou apres offset, la tete est positionnee a la fin du fichier (c'est-a-dire qu'il y a un trou implicite a la fin de tous les fichiers). Dans les deux cas precedents, lseek() echoue si offset pointe apres la fin du fichier. Ces operations permettent aux applications d'etablir une projection des trous dans un fichier fractionne. Cela peut servir aux applications du type outils de sauvegarde, qui peuvent economiser de l'espace lors de la creation de sauvegardes et conserver les trous, si elles disposent d'un mecanisme permettant de trouver les trous. Pour ces operations, un trou est une suite de zeros qui n'a (normalement) pas ete allouee au stockage sous-jacent du fichier. Cependant, un systeme de fichiers n'est pas force de signaler les trous, donc ces operations ne permettent pas de garantir la projection de l'espace de stockage vraiment alloue a un fichier (de plus, une suite de zeros vraiment ecrite sur le stockage sous-jacent pourrait ne pas etre signalee comme un trou). La plus simple implementation de ses operations pour un systeme de fichiers, serait avec SEEK_HOLE renvoyant toujours la position de fin de fichier, et SEEK_DATA renvoyant toujours offset (c'est-a-dire, meme si offset pointe a l'emplacement d'un trou, la suite de zeros peut etre consideree comme des donnees). La macro de test de fonctionnalites _GNU_SOURCE doit etre definie pour acceder aux definitions de SEEK_DATA et SEEK_HOLE depuis . Les operations SEEK_HOLE et SEEK_DATA sont prises en charge avec les systemes 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) (depuis Linux 3.8) - NFS (depuis Linux 3.18) - FUSE (depuis Linux 4.5) - GFS2 (depuis Linux 4.15) VALEUR RENVOYEE lseek(), si elle reussit, renvoie le nouvel emplacement, mesure en octets depuis le debut du fichier. En cas d'echec, la valeur (off_t) -1 est renvoyee, 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 demandee serait negative, ou apres la fin d'un peripherique. ENXIO whence vaut SEEK_DATA ou SEEK_HOLE, et offset est apres la fin du fichier, ou whence vaut SEEK_DATA et offset est dans un trou a la fin du fichier. EOVERFLOW La position resultante dans le fichier ne peut etre representee dans un off_t. ESPIPE fd est associe a un tube (pipe), un socket ou une file FIFO. VERSIONS Sous Linux, l'utilisation de lseek() sur un peripherique terminal echoue avec l'erreur ESPIPE. STANDARDS POSIX.1-2008. HISTORIQUE POSIX.1-2001, SVr4, 4.3BSD. SEEK_DATA et SEEK_HOLE sont des extensions non normalisees existant aussi sous Solaris, FreeBSD et DragonFly BSD. Leur integration est proposee pour la prochaine revision 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. Si l'attribut d'etat du fichier O_APPEND est positionne sur la description du fichier ouvert, une operation write(2) deplace toujours la position dans le fichier a la fin du fichier, independamment de l'utilisation de lseek(). Certains peripheriques ne permettent pas de positionnement direct, POSIX ne precise quels peripheriques doivent gerer lseek(). VOIR AUSSI dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Jean- Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.8 2 mai 2024 lseek(2)