lseek - Positionner la tête de lecture/écriture dans un fichier
Bibliothèque C standard (
libc,
-lc)
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
lseek() replace la description du fichier ouvert associée au
descripteur de fichier
fd au paramètre
offset en suivant
la directive
whence ainsi :
- SEEK_SET
- La tête est placée à offset
octets.
- SEEK_CUR
- La tête est placée à son emplacement
actuel plus offset octets.
- SEEK_END
- La tête est placée à la taille du
fichier plus offset octets.
lseek() permet de placer la tête au-delà de la fin du
fichier (mais cela ne modifie pas la taille du fichier). Si des données
sont écrites à cet emplacement, une lecture ultérieure de
l'espace intermédiaire (un « trou »)
retournera des octets NULL (« \0 ») jusqu'à
ce que d'autres données y soient écrites.
Depuis Linux 3.1, Linux prend en charge les valeurs
supplémentaires 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 fichiers, 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) (depuis Linux 3.8)
- •
- NFS (depuis Linux 3.18)
- •
- FUSE (depuis Linux 4.5)
- •
- GFS2 (depuis Linux 4.15)
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.
- 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 vaut SEEK_DATA ou SEEK_HOLE, et
offset est après la fin du fichier, ou whence vaut
SEEK_DATA et offset est dans un trou à la fin du
fichier.
- 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), un
socket ou une file FIFO.
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).
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'état du fichier
O_APPEND est positionné sur
la description du fichier ouvert, une opération
write(2)
déplace
toujours la position dans le fichier à la fin du
fichier, indépendamment de l'utilisation de
lseek().
Le type de données
off_t est un type de données entier
signé spécifié par POSIX.1.
Certains périphériques ne permettent pas de positionnement direct,
POSIX ne précise quels périphériques doivent gérer
lseek().
Sous Linux, l'utilisation de
lseek() sur un périphérique
terminal échoue avec l'erreur
ESPIPE.
dup(2),
fallocate(2),
fork(2),
open(2),
fseek(3),
lseek64(3),
posix_fallocate(3)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]>,
Frédéric Hantrais <
[email protected]> et Jean-Philippe
MENGUAL <
[email protected]>
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 à
[email protected]