read(2) | System Calls Manual | read(2) |
read - Lire depuis un descripteur de fichier
Bibliothèque C standard (libc, -lc)
#include <unistd.h>
ssize_t read(int fd, void buf[.count], size_t count);
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.
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.
D'autres erreurs peuvent se produire suivant le type d'objet associé à fd.
SVr4, 4.3BSD, POSIX.1-2001.
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.
Selon POSIX.1-2008/SUSv4, Section XSI 2.9.7 (« Thread Interactions with Regular File Operations ») :
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.
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(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 <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 à debian-l10n-french@lists.debian.org.
4 décembre 2022 | Pages du manuel de Linux 6.03 |