Provided by: manpages-fr-dev_3.32d0.2p4-1_all bug

NOM

       readv, writev, preadv, pwritev - 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);

       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);

   Exigences  de  macros  de  test de fonctionnalités pour la glibc (consultez
   feature_test_macros(7)) :

       preadv(), pwritev() : _BSD_SOURCE

DESCRIPTION

       L'appel système readv() lit  iovcnt  blocs  depuis  le  descripteur  de
       fichier fd dans les multiples tampons décrits par iov.

       L'appel  système  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 */
           };

       L'appel  système  readv()  travaille  comme  read(2) sauf que plusieurs
       tampons sont remplis.

       L'appel système 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 (consultez open(2)).

   preadv() et pwritev()
       L'appel  système  preadv()  combine  les  fonctionnalités de readv() et
       pread(2). Il effectue  la  même  tâche  que  readv(),  mais  ajoute  un
       quatrième  paramètre, offset, qui indique la position dans le fichier à
       partir de laquelle l'opération d'entrée doit être effectuée.

       L'appel système pwritev() combine les fonctionnalités  de  writev()  et
       pwrite(2).  Il  effectue  la  même  tâche  que writev(), mais ajoute un
       quatrième paramètre, offset, qui indique la position dans le fichier  à
       partir de laquelle l'opération de sortie doit être effectuée.

       La  position dans le fichier n'est pas modifiée par ces appels système.
       Le fichier décrit par fd doit permettre le positionnement.

VALEUR RENVOYÉE

       S'ils réussissent, readv() et preadv()  renvoient  le  nombre  d'octets
       lus ;  writev  et pwritev() renvoient 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.  D'autre  part,  preadv()  et pwritev() peuvent aussi échouer
       pour les mêmes raisons que lseek(2). 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é.

VERSIONS

       preadv() et pwritev() sont apparus dans Linux 2.6.30 ; la glibc le gère
       depuis la version 2.10.

CONFORMITÉ

       readv(),  writev() :  BSD 4.4  (ces  appels  système  sont apparus dans
       BSD 4.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.

       preadv(),  pwritev()  :  non standard, mais sont aussi présents sur les
       BSD modernes.

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

       pread(2), read(2), write(2)

COLOPHON

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

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide  de  l'outil  po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'équipe   de   traduction
       francophone       au       sein        du        projet        perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Christophe  Blaess  <URL:http://www.blaess.fr/christophe/> (1996-2003),
       Alain  Portal  <URL:http://manpagesfr.free.fr/>   (2003-2006).   Julien
       Cristau et l'équipe francophone de traduction de Debian (2006-2009).

       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> ».