read(2) System Calls Manual read(2) NOM readv, writev, preadv, pwritev, preadv2, pwritev2 - Lire ou ecrire des donnees dans plusieurs tampons BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include ssize_t readv(int fd, const struct iovec *iov, int iovcnt); ssize_t writev(int fd, const struct iovec *iov, int iovcnt); ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset); ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags); ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : preadv(), pwritev() : Depuis la glibc 2.19 : _DEFAULT_SOURCE glibc 2.19 et anterieures : _BSD_SOURCE DESCRIPTION L'appel systeme readv() lit iovcnt tampons depuis le fichier associe au descripteur de fichier fd dans les tampons decrits par iov.(<< scatter input >>) L'appel systeme writev() ecrit au plus iovcnt tampons de donnees decrits par iov dans le fichier associe au descripteur fd (<< gather output >>). Le pointeur iov pointe vers un tableau de structures iovec, definies dans iovec(3type) L'appel systeme readv() travaille comme read(2) sauf que plusieurs tampons sont remplis. L'appel systeme writev() travaille comme write(2) sauf que plusieurs tampons sont ecrits. Les tampons sont consideres dans l'ordre du tableau. Cela signifie que readv() remplit iov[0] completement avant d'en arriver a iov[1], et ainsi de suite. (S'il n'y a pas assez de donnees, tous les tampons pointes par iov ne seront pas forcement remplis.) De meme, writev() ecrit tout le contenu de iov[0] avant de considerer iov[1] et ainsi de suite. Les transferts de donnees effectues par readv() et writev() sont atomiques : les donnees ecrites par writev() sont ecrites d'un bloc qui n'est pas interrompu par des ecritures venant d'autres processus ; de facon similaire, readv() a la garantie de lire un bloc contigu de donnees depuis le fichier, quelles que soient les operations de lecture effectuees par d'autres threads ou processus qui ont des descripteurs de fichier correspondant a la meme description de fichier ouvert (consultez open(2)). preadv() et pwritev() L'appel systeme preadv() combine les fonctionnalites de readv() et pread(2). Il effectue la meme tache que readv(), mais ajoute un quatrieme parametre, offset, qui indique la position dans le fichier a partir de laquelle l'operation d'entree doit etre effectuee. L'appel systeme pwritev() combine les fonctionnalites de writev() et pwrite(2). Il effectue la meme tache que writev(), mais ajoute un quatrieme parametre, offset, qui indique la position dans le fichier a partir de laquelle l'operation de sortie doit etre effectuee. La position dans le fichier n'est pas modifiee par ces appels systeme. Le fichier decrit par fd doit permettre le positionnement. preadv2() et pwritev2() Ces appels systeme sont identiques aux appels preadv() et pwritev() mais ils ajoutent un cinquieme parametre (flags) qui change le comportement sur la base de chaque appel. Contrairement a preadv() et pwritev(), si le parametre offset est -1, la tete de lecture du fichier actuel est utilisee et mise a jour. L'argument flags est un operateur OU binaire contenant zero ou plusieurs des attributs suivants : RWF_DSYNC (depuis Linux 4.7) Fournir un equivalent par ecriture a l'attribut O_DSYNC d'open(2). Cet attribut n'a de sens que pour pwritev2() et son effet ne vaut que pour la plage de donnees ecrite par l'appel systeme. RWF_HIPRI (depuis Linux 4.6) Lecture/ecriture haute priorite. Cela permet a des systemes de fichiers fondes sur les blocs d'utiliser la scrutation du peripherique, ce qui donne moins de latence mais peut couter plus de ressources (actuellement, cette fonctionnalite n'est utilisable que sur un descripteur de fichier ouvert avec l'attribut O_DIRECT). RWF_SYNC (depuis Linux 4.7) Fournir un equivalent par ecriture de l'attribut O_SYNC d'open(2). Cet attribut n'a de sens que pour pwritev2() et ses effets ne valent que pour la plage de donnees ecrite avec cet appel systeme. RWF_NOWAIT (depuis Linux 4.14) Ne pas attendre les donnees qui ne sont pas immediatement disponibles. Si cet attribut est indique, l'appel systeme preadv2() renverra quelque chose instantanement s'il doit lire des donnees provenant d'un stockage de cache ou attendre un verrou. Si des donnees ont ete lues avec succes, il renverra le nombre d'octets lus. Si aucun octet n'est lu, il renverra -1 et positionnera errno sur EAGAIN (mais consultez BUGS). Actuellement, cet attribut n'a de sens que pour preadv2(). RWF_APPEND (depuis Linux 4.16) Fournir un equivalent par ecriture de l'attribut O_APPEND d'open(2). Cet attribut n'a de sens que pour pwritev2 et ses effets ne valent que pour la plage de donnees ecrite par cet appel systeme. Le parametre offset n'affecte pas l'operation d'ecriture ; les donnees vont toujours a la fin du fichier. Cependant, si le parametre offset est -1, la tete de lecture du fichier actuel est mise a jour. VALEUR RENVOYEE S'ils reussissent, readv(), preadv() et preadv2() renvoient le nombre d'octets lus ; writev, pwritev() et pwritev2() renvoient le nombre d'octets ecrits. Remarquez que le fait de transferer moins d'octets que deux demandes (voir read(2) et write(2)) ne constitue pas une erreur empechant le succes de l'appel. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. ERREURS Les erreurs sont comme celles indiquees pour read(2) et write(2). En outre, preadv(), preadv2() et pwritev() peuvent aussi echouer pour les memes raisons que lseek(2). De plus, les erreurs suivantes peuvent survenir : EINVAL La somme des valeurs iov_len deborde une valeur ssize_t. EINVAL Le nombre de vecteurs iovcnt est inferieur a zero ou superieur au maximum autorise. EOPNOTSUPP Un drapeau inconnu est indique dans flags. VERSIONS Differences entre bibliotheque C et noyau Les appels systeme preadv() et pwritev() bruts ont une signature d'appel differant legerement de celle des fonctions d'enveloppe de la bibliotheque C presentees dans le SYNOPSIS. Le parametre offset final est depaquete par les fonctions d'enveloppe sous la forme de deux parametres des appels systeme : unsigned long pos_l, unsigned long pos Ces parametres contiennent respectivement les 32 bits d'ordre bas et haut de l'offset. STANDARDS readv() writev() POSIX.1-2008. preadv() pwritev() BSD. preadv2() pwritev2() Linux. HISTORIQUE readv() writev() POSIX.1-2001, 4.4BSD (apparu dans 4.2BSD). preadv(), pwritev() : Linux 2.6.30, glibc 2.10. preadv2(), pwritev2() : Linux 4.6, glibc 2.26. Difference historique entre la bibliotheque C et le noyau Pour gerer le fait que IOV_MAX etait trop bas sur les premieres versions de Linux, les fonctions d'enveloppe de la glibc pour readv() et writev() effectuaient un travail supplementaire si elles detectaient que les appels systeme du noyau sous-jacents echouaient a cause d'un depassement de la limite. Pour readv(), la fonction d'enveloppe allouait un tampon temporaire assez grand pour tous les elements de iov, passait ce tampon dans un appel read(2), copiait les donnees du tampon vers les emplacements indiques par le champ iov_base des elements de iov, puis liberait le tampon. La fonction d'enveloppe de writev() faisait la meme chose avec un tampon temporaire et un appel a write(2). La necessite d'un tel effort supplementaire par les fonctions d'enveloppe de la glibc a disparu avec Linux 2.2 et ulterieurs. Cependant la glibc a continue a fournir ce comportement jusqu'a la glibs 2.10. A partir de la version 2.9 de la glibc, les fonctions d'enveloppe ne fournissent ce comportement que si la bibliotheque detecte que le systeme a un noyau Linux plus ancien que Linux 2.6.18 (une version du noyau selectionnee a votre guise). Depuis la glibc 2.20 (qui necessite au minimum Linux 2.6.32), les fonctions d'enveloppe de la glibc appellent simplement les appels systeme dans tous les cas. NOTES POSIX.1 autorise une implementation a poser une limite au nombre d'elements qui peuvent etre places dans iov. Une implementation peut indiquer cette limite en definissant IOV_MAX dans ou pendant l'execution a l'aide d'un code de retour issu de sysconf(_SC_IOV_MAX). Sur les systemes Linux modernes, la limite est de 1024. A l'epoque de Linux 2.0, la limite etait de 16. BOGUES Linux 5.9 et Linux 5.10 contiennent un bogue dans lequel preadv2() avec l'attribut RWF_NOWAIT peut renvoyer 0 meme quand la fin du fichier n'est pas atteinte. EXEMPLES Le segment de code suivant donne un exemple d'utilisation de writev() : char *str0 = "hello "; char *str1 = "world\n"; ssize_t nwritten; struct iovec iov[2]; iov[0].iov_base = str0; iov[0].iov_len = strlen(str0); iov[1].iov_base = str1; iov[1].iov_len = strlen(str1); nwritten = writev(STDOUT_FILENO, iov, 2); VOIR AUSSI pread(2), read(2), write(2) 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)