Loading

NOM

       readv, writev - Lire ou écrire dans plusieurs tampons

SYNOPSIS

       #include <sys/uio.h>

       ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

       ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

       La  fonction  readv() lit iovcnt blocs depuis le descripteur de fichier
       fd dans les multiples tampons décrits par iov.

       La fonction writev() écrit au plus iovcnt blocs décrits par iov dans le
       fichier associé au descripteur fd.

       Le  pointeur  iov  pointe  vers un tableau de structures iovec définies
       dans <sys/uio.h> :

           struct iovec {
               void  *iov_base;    /* Adresse de début */
               size_t iov_len;     /* Nombre d’octets à transférer */
           };

       La fonction readv() travaille comme read(2) sauf que plusieurs  tampons
       sont remplis.

       La  fonction  writev()  travaille  comme  write(2)  sauf  que plusieurs
       tampons sont écrits.

       Les tampons sont considérés dans l’ordre du tableau. Cela signifie  que
       readv()  remplit  iov[0]  complètement  avant d’en arriver à iov[1], et
       ainsi de suite. (S’il n’y a pas assez  de  données,  tous  les  tampons
       pointés  par  iov  ne  seront pas forcément remplis.) De même, writev()
       écrit tout le contenu de iov[0] avant de considérer iov[1], et ainsi de
       suite.

       Les  transferts  de  données  effectués  par  readv()  et writev() sont
       atomiques : les données écrites par writev() sont écrites d’un bloc qui
       n’est  pas interrompu par des écritures venant d’autres processus (mais
       voir pipe(7) pour une exception) ; de façon  similaire,  readv()  a  la
       garantie  de lire un bloc contigu de données depuis le fichier, quelles
       que soient les opérations de lecture effectuées par d’autres threads ou
       processus  qui  ont des descripteurs de fichier correspondant à la même
       description de fichier ouvert (voir open(2)).

VALEUR RENVOYÉE

       S’ils réussissent readv() renvoie le  nombre  d’octets  lus  et  writev
       renvoie  le  nombre  d’octets écrits. En cas d’échec -1 est renvoyé, et
       errno contient le code d’erreur.

ERREURS

       Les erreurs indiquées pour read(2) et write(2) sont susceptibles de  se
       produire. De plus, il peut survenir :

       EINVAL La  somme  des  valeurs  iov_len  déborde du type ssize_t, ou le
              nombre iovcnt  de  vecteur  est  nul  ou  supérieur  au  maximum
              autorisé.

CONFORMITÉ

       BSD 4.4  (les fonctions readv() et writev() sont apparues dans BSD4.2),
       POSIX.1-2001. La libc5 de  Linux  utilisait  le  type  size_t  pour  le
       paramètre iovcnt et int en retour de ces fonctions.

NOTES

   Notes sur Linux
       POSIX.1-2001  permet à l’implémentation de limiter le nombre d’éléments
       qui peuvent être passés dans iov. Une implémentation peut  annoncer  sa
       limite  en  définissant  IOV_MAX  dans  <limits.h>  ou  à l’exécution à
       travers sysconf(_SC_IOV_MAX). Sous Linux, la limite annoncée ainsi  est
       1024,  qui  est  la véritable limite du noyau. Cependant, les fonctions
       d’enrobage  de  la  glibc  font  du  travail  supplémentaire  si  elles
       détectent  que l’appel système a échoué en raison de cette limite. Pour
       readv(), la fonction d’enrobage alloue un tampon temporaire assez grand
       pour  tous  les  éléments  de iov, passe ce tampon à read(2), copie les
       données du tampon vers les emplacements indiqués par le champ  iov_base
       des  éléments  de iov, puis libère le tampon. La fonction d’enrobage de
       writev() fonctionne de façon similaire avec un tampon temporaire et  un
       appel à write(2).

BOGUES

       Il  est  déconseillé  de  mélanger  les  appels readv() ou writev() qui
       agissent sur les descripteurs avec les  fonctions  de  la  bibliothèque
       stdio ;  les  résultats sont indéfinis et probablement différents de ce
       que l’on attend.

EXEMPLE

       Le segment de code suivant donne un exemple d’utilisation de writev() :

           char *str0 = "hello ";
           char *str1 = "world\n";
           struct iovec iov[2];
           ssize_t nwritten;

           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

       read(2), write(2)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite  et  mise  à  jour  par  Christophe
       Blaess  <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
       Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et  mise  à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

       Veuillez   signaler   toute   erreur   de   traduction  en  écrivant  à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « man -L C <section> <page_de_man> ».