read
Section: System Calls (2)
Updated: 4 décembre 2022
Index
Return to Main Contents
NOM
read - Lire depuis un descripteur de fichier
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <unistd.h>
ssize_t read(int fd, void buf[.count], size_t count);
DESCRIPTION
read() lit jusqu'à count octets depuis le descripteur de fichier fd
dans le tampon pointé par buf.
Sur les fichiers permettant le positionnement, l'opération de lecture a lieu
à la position actuelle dans le fichier et elle est déplacée du nombre
d'octets lus. Si la position actuelle dans le fichier est à la fin du
fichier ou après, aucun octet n'est lu et read() renvoie zéro.
Si count vaut zéro, read() pourrait détecter les erreurs décrites
ci-dessous. En l’absence d'erreur, ou si read() ne vérifie pas les
erreurs, un read() avec un count de 0 renvoie zéro et n'a pas
d'autres effets.
Selon POSIX.1, si count est supérieur à SSIZE_MAX, le résultat est
défini par l'implémentation ; voir les NOTES pour la limite supérieure sous
Linux.
VALEUR RENVOYÉE
En cas de succès, le nombre d'octets lus est renvoyé (zéro indique une fin
de fichier), et la tête de lecture est avancée de ce nombre. Le fait que le
nombre renvoyé soit plus petit que le nombre demandé n'est pas une
erreur. Cela se produit, par exemple, s'il y a moins d'octets disponibles
(parce qu'on était peut-être près de la fin du fichier, ou parce qu'on lit
depuis un tube ou un terminal) ou bien si read() a été interrompu par un
signal. Voir les NOTES.
En cas d'erreur, la valeur de retour est -1 et errno est définie pour
préciser l'erreur. Dans ce cas, il n'est pas indiqué si la position du
fichier (s'il y en a) change.
ERREURS
- EAGAIN
-
Le descripteur de fichier fd fait référence à un fichier autre qu'un
socket et a été marqué comme non bloquant (O_NONBLOCK), et la lecture
devrait bloquer. Voir open(2) pour plus de détails sur l'attribut
O_NONBLOCK.
- EAGAIN ou EWOULDBLOCK
-
Le descripteur de fichier fd fait référence à un socket et a été marqué
comme non bloquant (O_NONBLOCK), et la lecture devrait
bloquer. POSIX.1-2001 permet de renvoyer l'une ou l'autre des erreurs dans
ce cas et n'exige pas que ces constantes aient la même valeur. Une
application portable devrait donc tester les deux possibilités.
- EBADF
-
fd n'est pas un descripteur de fichier valable ou n'est pas ouvert en
lecture.
- EFAULT
-
buf pointe en dehors de l'espace d'adressage accessible.
- EINTR
-
read() a été interrompu par un signal avant d'avoir eu le temps de lire
quoi que ce soit ; consultez signal(7).
- EINVAL
-
Le descripteur fd correspond à un objet qu'il est impossible de lire. Ou
bien le fichier a été ouvert avec l'attribut O_DIRECT, et l'adresse de
buf, la valeur de count ou la position actuelle de la tête de lecture
ne sont pas alignées correctement.
- EINVAL
-
fd a été créé par un appel à timerfd_create(2) et une mauvaise taille
de tampon a été donnée à read() ; consultez timerfd_create(2) pour
plus d'informations.
- EIO
-
Erreur d'entrée-sortie. Cela arrive, par exemple, si un processus est dans
un groupe en arrière-plan et tente de lire depuis le terminal qui le gère et
soit il ignore, soit il bloque un signal SIGTTIN, ou bien son groupe est
orphelin. Cela arrive également si une erreur d'entrée-sortie de bas niveau
s'est produite pendant la lecture d'un disque ou d'une bande. Une autre
cause possible de EIO sur les systèmes de fichiers en réseau est la
présence d'un verrou consultatif sur le descripteur de fichier et le fait
qu'il a été perdu. Voir la section Perte de verrou de fcntl(2) pour
plus de détails.
- EISDIR
-
fd est un répertoire.
D'autres erreurs peuvent se produire suivant le type d'objet associé à
fd.
STANDARDS
SVr4, 4.3BSD, POSIX.1-2001.
NOTES
Les types size_t et ssize_t sont respectivement des types de données
d’entiers non signés et signés indiqués par POSIX.1.
Sur Linux, read() (et les appels système équivalents) transfèreront au
maximum 0x7ffff000 (2 147 479 552) octets et renverront le nombre d'octets
transférés (cela est vrai aussi bien sur des systèmes 32 que 64 bits).
Sur un système de fichiers NFS, la lecture de petites quantités de données
ne mettra à jour l'horodatage du fichier que lors de la première
lecture. Les lectures suivantes ne modifieront pas cette heure. Cela est dû
à la mise en cache des attributs côté client, car la plupart, si ce n'est
tous les clients NFS, mettent à jour sur le serveur st_atime (heure de
dernier accès au fichier), et les lectures côté client satisfaites par le
cache du client n'effectueront pas la mise à jour de st_atime sur le
serveur, car il n'y a pas de lecture du côté serveur. La véritable
sémantique UNIX peut être obtenue en désactivant le cache des attributs du
côté client, mais généralement cela augmente sensiblement la charge du
serveur et dégrade les performances.
BOGUES
Selon POSIX.1-2008/SUSv4, Section XSI 2.9.7 (« Thread Interactions with
Regular File Operations ») :
-
Toutes les fonctions suivantes doivent être atomiques et ne pas se perturber
mutuellement pour ce qui concerne les effets spécifiés dans POSIX.1-2008
lorsqu'elles opèrent sur les fichiers normaux ou sur les liens
symboliques : ...
read() et readv(2) figurent parmi les API listées par la suite. En
outre, la mise à jour du décalage de fichier fait partie des effets qui
doivent être atomiques pour les threads (et pour les processus). Cependant,
avant Linux 3.14, cela n'était pas le cas : si deux processus partageant un
même descripteur de fichier ouvert (consultez open(2)) effectuaient une
action read() (ou readv(2)) simultanément, alors les opérations E/S
n'étaient pas atomiques pour ce qui concernait la mise à jour du décalage de
fichier. En conséquence, les lectures effectuées par les deux processus
pouvaient se chevaucher au niveau des blocs des données récupérées (de façon
incorrecte). Ce problème a été résolu dans Linux 3.14.
VOIR AUSSI
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2),
readdir(2), readlink(2), readv(2), select(2), write(2),
fread(3)
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>,
Frédéric Hantrais <fhantrais@gmail.com>
et
Jean-Philippe MENGUAL <jpmengual@debian.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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- STANDARDS
-
- NOTES
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 06:42:17 GMT, May 18, 2024