dwww Home | Manual pages | Find package

process_vm_readv(2)           System Calls Manual          process_vm_readv(2)

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 directe-
       ment 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  lo-
       cal_iov.

       L'appel    système   process_vm_writev()   fait   l'inverse   de   pro-
       cess_vm_readv() — il transfère les données du processus local  au  pro-
       cessus  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  re-
       mote_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 confi-
       guré à 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  trans-
       fert. 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  proces-
       sus  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'écri-
       ture. Par conséquent, une lecture ou écriture partielle (consultez  VA-
       LEUR 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  dis-
       tant.  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  re-
       mote_iov  à  fusionner ensuite dans une seule entrée local_iov. La pre-
       miè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  io-
       vec). 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.

VERSIONS
       Ces appels système ont été ajoutés à Linux 3.2. La prie en  charge  est
       fournie depuis la glibc 2.15.

STANDARDS
       Ces appels système sont des extensions spécifiques à Linux.

NOTES
       Les  transferts  de  données  réalisés  par  process_vm_readv() et pro-
       cess_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  utili-
       sant, 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 Chris-
       tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <ste-
       phan.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.cou-
       lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>,  Thomas  Huriaux
       <thomas.huriaux@gmail.com>,  Nicolas François <nicolas.francois@centra-
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon  Paillard  <si-
       mon.paillard@resel.enst-bretagne.fr>,    Denis   Barbier   <barbier@de-
       bian.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⟩.

Pages du manuel de Linux 6.03   5 février 2023             process_vm_readv(2)

Generated by dwww version 1.15 on Sat Jun 29 01:33:37 CEST 2024.