read(2) System Calls Manual read(2) NOM read - Lire depuis un descripteur de fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include ssize_t read(int fd, void buf[.count], size_t count); DESCRIPTION read() lit jusqu'a count octets depuis le descripteur de fichier fd dans le tampon pointe par buf. Sur les fichiers permettant le positionnement, l'operation de lecture a lieu a la position actuelle dans le fichier et elle est deplacee du nombre d'octets lus. Si la position actuelle dans le fichier est a la fin du fichier ou apres, aucun octet n'est lu et read() renvoie zero. Si count vaut zero, read() pourrait detecter les erreurs decrites ci-dessous. En l'absence d'erreur, ou si read() ne verifie pas les erreurs, un read() avec un count de 0 renvoie zero et n'a pas d'autres effets. Selon POSIX.1, si count est superieur a SSIZE_MAX, le resultat est defini par l'implementation ; voir les NOTES pour la limite superieure sous Linux. VALEUR RENVOYEE En cas de succes, le nombre d'octets lus est renvoye (zero indique une fin de fichier), et la tete de lecture est avancee de ce nombre. Le fait que le nombre renvoye soit plus petit que le nombre demande n'est pas une erreur. Cela se produit, par exemple, s'il y a moins d'octets disponibles (parce qu'on etait peut-etre pres de la fin du fichier, ou parce qu'on lit depuis un tube ou un terminal) ou bien si read() a ete interrompu par un signal. Voir les NOTES. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. Dans ce cas, il n'est pas indique si la position du fichier (s'il y en a) change. ERREURS EAGAIN Le descripteur de fichier fd fait reference a un fichier autre qu'un socket et a ete marque comme non bloquant (O_NONBLOCK), et la lecture devrait bloquer. Voir open(2) pour plus de details sur l'attribut O_NONBLOCK. EAGAIN ou EWOULDBLOCK Le descripteur de fichier fd fait reference a un socket et a ete marque 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 meme valeur. Une application portable devrait donc tester les deux possibilites. 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 ete interrompu par un signal avant d'avoir eu le temps de lire quoi que ce soit ; consultez signal(7). EINVAL Le descripteur fd correspond a un objet qu'il est impossible de lire. Ou bien le fichier a ete ouvert avec l'attribut O_DIRECT, et l'adresse de buf, la valeur de count ou la position actuelle de la tete de lecture ne sont pas alignees correctement. EINVAL fd a ete cree par un appel a timerfd_create(2) et une mauvaise taille de tampon a ete donnee a read() ; consultez timerfd_create(2) pour plus d'informations. EIO Erreur d'entree-sortie. Cela arrive, par exemple, si un processus est dans un groupe en arriere-plan et tente de lire depuis le terminal qui le gere et soit il ignore, soit il bloque un signal SIGTTIN, ou bien son groupe est orphelin. Cela arrive egalement si une erreur d'entree-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 systemes de fichiers en reseau est la presence d'un verrou consultatif sur le descripteur de fichier et le fait qu'il a ete perdu. Voir la section Perte de verrou de fcntl(2) pour plus de details. EISDIR fd est un repertoire. D'autres erreurs peuvent se produire suivant le type d'objet associe a fd. STANDARDS POSIX.1-2008. HISTORIQUE SVr4, 4.3BSD, POSIX.1-2001. NOTES Sur Linux, read() (et les appels systeme equivalents) transfereront au maximum 0x7ffff000 (2 147 479 552) octets et renverront le nombre d'octets transferes (cela est vrai aussi bien sur des systemes 32 que 64 bits). Sur un systeme de fichiers NFS, la lecture de petites quantites de donnees ne mettra a jour l'horodatage du fichier que lors de la premiere lecture. Les lectures suivantes ne modifieront pas cette heure. Cela est du a la mise en cache des attributs cote client, car la plupart, si ce n'est tous les clients NFS, mettent a jour sur le serveur st_atime (heure de dernier acces au fichier), et les lectures cote client satisfaites par le cache du client n'effectueront pas la mise a jour de st_atime sur le serveur, car il n'y a pas de lecture du cote serveur. La veritable semantique UNIX peut etre obtenue en desactivant le cache des attributs du cote client, mais generalement cela augmente sensiblement la charge du serveur et degrade les performances. BOGUES Selon POSIX.1-2008/SUSv4, Section XSI 2.9.7 (<< Thread Interactions with Regular File Operations >>) : Toutes les fonctions suivantes doivent etre atomiques et ne pas se perturber mutuellement pour ce qui concerne les effets specifies dans POSIX.1-2008 lorsqu'elles operent sur les fichiers normaux ou sur les liens symboliques : ... read() et readv(2) figurent parmi les API listees par la suite. En outre, la mise a jour du decalage de fichier fait partie des effets qui doivent etre atomiques pour les threads (et pour les processus). Cependant, avant Linux 3.14, cela n'etait pas le cas : si deux processus partageant un meme descripteur de fichier ouvert (consultez open(2)) effectuaient une action read() (ou readv(2)) simultanement, alors les operations E/S n'etaient pas atomiques pour ce qui concernait la mise a jour du decalage de fichier. En consequence, les lectures effectuees par les deux processus pouvaient se chevaucher au niveau des blocs des donnees recuperees (de facon incorrecte). Ce probleme a ete resolu 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 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.06 31 octobre 2023 read(2)