Provided by: manpages-fr-dev_3.65d1p1-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.65 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

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

       Christophe   Blaess   <http://www.blaess.fr/christophe/>   (1996-2003),    Alain    Portal
       <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> ».