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

NOM

       readv, writev, preadv, pwritev - Lire ou ecrire 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 fonctionnalites pour la glibc (consultez
   feature_test_macros(7)) :

       preadv(), pwritev() : _BSD_SOURCE

DESCRIPTION

       L'appel systeme readv() lit  iovcnt  blocs  depuis  le  descripteur  de
       fichier fd dans les multiples tampons decrits par iov.

       L'appel  systeme  writev()  ecrit  au plus iovcnt blocs decrits par iov
       dans le fichier associe au descripteur fd.

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

           struct iovec {
               void  *iov_base;    /* Adresse de debut */
               size_t iov_len;     /* Nombre d'octets a transferer */
           };

       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  (mais
       voir  pipe(7)  pour  une  exception) ; 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.

VALEUR RENVOY'EE

       S'ils reussissent, readv() et preadv()  renvoient  le  nombre  d'octets
       lus ;  writev  et pwritev() renvoient le nombre d'octets ecrits. En cas
       d'echec, -1 est renvoye, et errno contient le code d'erreur.

ERREURS

       Les erreurs indiquees pour read(2) et write(2) sont susceptibles de  se
       produire.  D'autre  part,  preadv()  et pwritev() peuvent aussi echouer
       pour les memes raisons que lseek(2). De plus, il peut survenir :

       EINVAL La somme des valeurs iov_len deborde  du  type  ssize_t,  ou  le
              nombre  iovcnt  de  vecteur  est  nul  ou  superieur  au maximum
              autorise.

VERSIONS

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

CONFORMIT'E

       readv(),  writev() :  BSD 4.4  (ces  appels  systeme  sont apparus dans
       BSD 4.2), POSIX.1-2001. La libc5 de Linux utilisait le type size_t pour
       le parametre iovcnt et int en retour de ces fonctions.

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

NOTES

   Notes sur Linux
       POSIX.1-2001 permet a l'implementation de limiter le nombre  d'elements
       qui  peuvent  etre passes dans iov. Une implementation peut annoncer sa
       limite en definissant  IOV_MAX  dans  <limits.h>  ou  a  l'execution  a
       travers  sysconf(_SC_IOV_MAX). Sous Linux, la limite annoncee ainsi est
       1024, qui est la veritable limite du noyau.  Cependant,  les  fonctions
       d'enrobage  de  la  glibc  font  du  travail  supplementaire  si  elles
       detectent que l'appel systeme a echoue en raison de cette limite.  Pour
       readv(), la fonction d'enrobage alloue un tampon temporaire assez grand
       pour tous les elements de iov, passe ce tampon  a  read(2),  copie  les
       donnees  du tampon vers les emplacements indiques par le champ iov_base
       des elements de iov, puis libere le tampon. La fonction  d'enrobage  de
       writev()  fonctionne de facon similaire avec un tampon temporaire et un
       appel a write(2).

BOGUES

       Il est deconseille de melanger les appels a  readv()  ou  writev()  qui
       agissent  sur  les  descripteurs  avec les fonctions de la bibliotheque
       stdio ; les resultats sont indefinis et probablement differents  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       etre       trouvees      a      l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis 2010, cette traduction est maintenue a l'aide  de  l'outil  po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   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'equipe francophone de traduction de Debian (2006-2009).

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

       Vous  pouvez  toujours avoir acces a la version anglaise de ce document
       en utilisant la commande << man -L C <section> <page_de_man> >>.