Provided by: manpages-fr-dev_4.23.1-1_all bug

NOM

       process_vm_readv, process_vm_writev - Transférer les données entre les espaces d'adressage
       de processus

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/uio.h>

       ssize_t process_vm_readv(pid_t pid,
                              const struct iovec *local_iov,
                              unsigned long liovcnt,
                              const struct iovec *remote_iov,
                              unsigned long riovcnt,
                              unsigned long flags);
       ssize_t process_vm_writev(pid_t pid,
                              const struct iovec *local_iov,
                              unsigned long liovcnt,
                              const struct iovec *remote_iov,
                              unsigned long riovcnt,
                              unsigned long flags);

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

       process_vm_readv(), process_vm_writev() :
           _GNU_SOURCE

DESCRIPTION

       Ces appels système transfèrent des données entre l'espace d'adressage du processus d'appel
       (« le processus local ») et du processus identifié par pid (« le processus distant »). Les
       données  se  déplacent  directement entre les espaces d'adressage des deux processus, sans
       passer par l'espace du noyau.

       L'appel système process_vm_readv() transfère les données du processus distant au processus
       local.  Les  données  à transférer sont identifiées par remote_iov et riovcnt : remote_iov
       est un pointeur vers un tableau décrivant les intervalles d'adresses dans le processus pid
       et  riovcnt indique le nombre d'éléments dans remote_iov. Les données sont transférées aux
       endroits indiqués par local_iov et liovcnt : local_iov est un  pointeur  vers  un  tableau
       décrivant  les  intervalles  d'adresses  dans  le processus appelant et liovcnt indique le
       nombre d'éléments dans local_iov.

       L'appel système process_vm_writev() fait l'inverse de  process_vm_readv()  — il  transfère
       les données du processus local au processus distant. À part la direction du transfert, les
       arguments liovcnt, local_iov, riovcnt et remote_iov  ont  la  même  signification  qu'avec
       process_vm_readv().

       Les  arguments  local_iov  et  remote_iov  pointent  vers  un tableau de structures iovec,
       définies dans iovec(3type).

       Les tampons sont traités dans l'ordre du tableau.  Cela  signifie  que  process_vm_readv()
       remplit   complètement   local_iov[0]  avant  de  passer  à  local_iov[1], etc.  De  même,
       remote_iov[0] est complètement lu avant de passer à remote_iov[1], etc.

       De même, process_vm_writev() écrit tout le contenu  de  local_iov[0]  avant  de  passer  à
       local_iov[1], et il remplit complètement remote_iov[0] avant de passer à remote_iov[1].

       Les  longueurs  de  remote_iov[i].iov_len  et local_iov[i].iov_len n'ont pas besoin d'être
       identiques. Ainsi, il est possible de séparer un seul tampon local  en  plusieurs  tampons
       distants, ou vice versa.

       L'argument flags n'est pour l'instant pas utilisé et doit être configuré à 0.

       Les  valeurs  indiquées  dans  les arguments liovcnt et riovcnt doivent être inférieures à
       IOV_MAX (définie dans <limits.h> ou accessibles par l'appel sysconf(_SC_IOV_MAX)).

       Les arguments de décompte et local_iov sont vérifiés avant tout transfert. Si le  décompte
       est  trop  grand, que local_iov n'est pas valable ou que les adresses font référence à des
       régions inaccessibles au processus local, aucun des vecteurs ne sera traité et une  erreur
       sera immédiatement renvoyée.

       Remarquez  cependant  que  ces  appels système ne vérifient les régions de mémoire dans le
       processus distant que juste avant la lecture ou l'écriture. Par conséquent, une lecture ou
       écriture  partielle  (consultez  VALEUR  RENVOYÉE)  pourrait  avoir  comme résultat un des
       éléments remote_iov pointant vers une région de mémoire  non  valable  dans  le  processus
       distant.  Aucune  lecture ou écriture supplémentaires ne seront tentées après cela. Gardez
       cela à l'esprit lors d'une tentative de lecture de données de longueur inconnue (comme des
       chaînes C  qui se terminent par un caractère NULL) depuis un processus distant, en évitant
       de s'étendre sur les pages mémoire (en général 4 Kio) dans un seul élément  iovec  distant
       (à  la  place, séparez la lecture distante en deux éléments remote_iov à fusionner ensuite
       dans une seule entrée local_iov. La première entrée lue s'arrête à la frontière  de  page,
       tandis que la seconde commence à la frontière de page suivante).

       Le  droit  d'écriture  ou  de  lecture  d'un autre processus est géré par une vérification
       PTRACE_MODE_ATTACH_REALCREDS du mode d'accès de ptrace ; voir ptrace(2).

VALEUR RENVOYÉE

       En  cas  de   réussite,   process_vm_readv()   renvoie   le   nombre   d'octets   lus   et
       process_vm_writev() renvoie le nombre d'octets écrits. Cette valeur renvoyée pourrait être
       inférieure au nombre total d'octets demandés si une  lecture  ou  écriture  partielle  est
       survenue  (les  transferts  partiels s'appliquent à la granularité des éléments iovec. Ces
       appels systèmes ne réaliseront pas de transfert partiel qui sépare un seul élément iovec).
       L'appelant  devrait vérifier la valeur renvoyée pour déterminer si une lecture ou écriture
       partielle est survenue.

       En cas d'erreur, la valeur de retour est -1 et errno est définie pour préciser l'erreur.

ERREURS

       EFAULT La mémoire  décrite  par  local_iov  est  en  dehors  de  l'espace  d'adressage  de
              l'appelant.

       EFAULT La  mémoire  décrite  par  remote_iov  est  en  dehors  de  l'espace d'adressage du
              processus pid.

       EINVAL La somme des valeurs iov_len de local_iov ou remote_iov dépasse une valeur ssize_t.

       EINVAL flags n'est pas 0.

       EINVAL liovcnt ou riovcnt sont trop grands.

       ENOMEM Impossible d'allouer de la mémoire pour les copies internes de structures iovec.

       EPERM  L'appelant n'a pas le droit d'accéder à l'espace d'adressage du processus pid.

       ESRCH  Aucun processus n'existe avec l'identifiant pid.

STANDARDS

       Linux.

HISTORIQUE

       Linux 3.2, glibc 2.15.

NOTES

       Les transferts de données réalisés par process_vm_readv() et process_vm_writev()  ne  sont
       pas garantis être atomiques en aucune façon.

       Ces  appels  système  ont  été conçus pour permettre la transmission rapide de messages en
       autorisant l'échange de messages avec une seul opération de copie (plutôt  que  la  double
       copie  qui  serait  nécessaire en utilisant, par exemple, la mémoire partagée ou les tubes
       (« pipes »)).

EXEMPLES

       Le  code  suivant  montre  l'utilisation  de  process_vm_readv().  Il  lit   20 octets   à
       l'adresse 0x10000 du processus de PID 10 et écrit les 10 premiers octets dans tamp1 et les
       10 octets suivants dans tamp2.

       #define _GNU_SOURCE
       #include <stdlib.h>
       #include <sys/types.h>
       #include <sys/uio.h>

       int
       main(void)
       {
           char          buf1[10];
           char          buf2[10];
           pid_t         pid = 10;    /* PID du processus distant */
           ssize_t       nread;
           struct iovec  local[2];
           struct iovec  remote[1];

           local[0].iov_base = buf1;
           local[0].iov_len = 10;
           local[1].iov_base = buf2;
           local[1].iov_len = 10;
           remote[0].iov_base = (void *) 0x10000;
           remote[0].iov_len = 20;

           nread = process_vm_readv(pid, local, 2, remote, 1, 0);
           if (nread != 20)
               exit(EXIT_FAILURE);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       readv(2), writev(2)

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier  <barbier@debian.org>,  David  Prévot <david@tilapin.org> et Jean-Philippe MENGUAL
       <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.