.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2011 Christopher Yeoh .\" and Copyright (C) 2012 Mike Frysinger .\" and Copyright (C) 2012 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Commit fcf634098c00dd9cd247447368495f0b79be12d1 .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PROCESS_VM_READV 2 "9 juin 2020" Linux "Manuel du programmeur Linux" .SH NOM process_vm_readv, process_vm_writev \- Transférer les données entre les espaces d'adressage de processus .SH SYNOPSIS .nf \fB#include \fP .PP \fBssize_t process_vm_readv(pid_t \fP\fIpid\fP\fB,\fP \fB const struct iovec *\fP\fIlocal_iov\fP\fB,\fP \fB unsigned long \fP\fIliovcnt\fP\fB,\fP \fB const struct iovec *\fP\fIremote_iov\fP\fB,\fP \fB unsigned long \fP\fIriovcnt\fP\fB,\fP \fB unsigned long \fP\fIflags\fP\fB);\fP .PP \fBssize_t process_vm_writev(pid_t \fP\fIpid\fP\fB,\fP \fB const struct iovec *\fP\fIlocal_iov\fP\fB,\fP \fB unsigned long \fP\fIliovcnt\fP\fB,\fP \fB const struct iovec *\fP\fIremote_iov\fP\fB,\fP \fB unsigned long \fP\fIriovcnt\fP\fB,\fP \fB unsigned long \fP\fIflags\fP\fB);\fP .fi .PP .RS -4 Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7))\ : .RE .PP \fBprocess_vm_readv\fP(), \fBprocess_vm_writev\fP()\ : .PD 0 .ad l .RS 4 \fB_GNU_SOURCE\fP .RE .ad .PD .SH 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 \fIpid\fP («\ 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. .PP L'appel système \fBprocess_vm_readv\fP() transfère les données du processus distant au processus local. Les données à transférer sont identifiées par \fIremote_iov\fP et \fIriovcnt\fP\ : \fIremote_iov\fP est un pointeur vers un tableau décrivant les intervalles d'adresses dans le processus \fIpid\fP et \fIriovcnt\fP indique le nombre d'éléments dans \fIremote_iov\fP. Les données sont transférées aux endroits indiqués par \fIlocal_iov\fP et \fIliovcnt\fP\ : \fIlocal_iov\fP est un pointeur vers un tableau décrivant les intervalles d'adresses dans le processus appelant et \fIliovcnt\fP indique le nombre d'éléments dans \fIlocal_iov\fP. .PP L'appel système \fBprocess_vm_writev\fP() fait l'inverse de \fBprocess_vm_readv\fP() \(em\ il transfère les données du processus local au processus distant. À part la direction du transfert, les arguments \fIliovcnt\fP, \fIlocal_iov\fP, \fIriovcnt\fP et \fIremote_iov\fP ont la même signification qu'avec \fBprocess_vm_readv\fP(). .PP Les arguments \fIlocal_iov\fP et \fIremote_iov\fP pointent vers un tableau de structures \fIiovec\fP, définies dans \fI\fP\ : .PP .in +4n .EX struct iovec { void *iov_base; /* Adresse de début */ size_t iov_len; /* Nombre d'octets à transférer */ }; .EE .in .PP Les tampons sont traités dans l'ordre du tableau. Cela signifie que \fBprocess_vm_readv\fP() remplit complètement \fIlocal_iov[0]\fP avant de passer à \fIlocal_iov[1]\fP,\ etc. De même, \fIremote_iov[0]\fP est complètement lu avant de passer à \fIremote_iov[1]\fP,\ etc. .PP De même, \fBprocess_vm_writev\fP() écrit tout le contenu de \fIlocal_iov[0]\fP avant de passer à \fIlocal_iov[1]\fP, et il remplit complètement \fIremote_iov[0]\fP avant de passer à \fIremote_iov[1]\fP. .PP Les longueurs de \fIremote_iov[i].iov_len\fP et \fIlocal_iov[i].iov_len\fP 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. .PP L'argument \fIflags\fP n'est pour l'instant pas utilisé et doit être configuré à 0. .PP .\" In time, glibc might provide a wrapper that works around this limit, .\" as is done for readv()/writev() Les valeurs indiquées dans les arguments \fIliovcnt\fP et \fIriovcnt\fP doivent être inférieures à \fBIOV_MAX\fP (définie dans \fI\fP ou accessibles par l'appel \fIsysconf(_SC_IOV_MAX)\fP). .PP Les arguments de décompte et \fIlocal_iov\fP sont vérifiés avant tout transfert. Si le décompte est trop grand, que \fIlocal_iov\fP 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. .PP 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 \fBVALEUR RENVOYÉE\fP) pourrait avoir comme résultat un des éléments \fIremote_iov\fP 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 \fIiovec\fP distant (à la place, séparez la lecture distante en deux éléments \fIremote_iov\fP à fusionner ensuite dans une seule entrée \fIlocal_iov\fP. 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). .PP Le droit d'écriture ou de lecture d'un autre processus est géré par une vérification \fBPTRACE_MODE_ATTACH_REALCREDS\fP du mode d'accès de ptrace ; voir \fBptrace\fP(2). .SH "VALEUR RENVOYÉE" En cas de réussite, \fBprocess_vm_readv\fP() renvoie le nombre d'octets lus et \fBprocess_vm_writev\fP() 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 \fIiovec\fP. Ces appels systèmes ne réaliseront pas de transfert partiel qui sépare un seul élément \fIiovec\fP). L'appelant devrait vérifier la valeur renvoyée pour déterminer si une lecture ou écriture partielle est survenue. .PP En cas d'erreur, \-1 est renvoyé et \fIerrno\fP contient le code d'erreur. .SH ERREURS .TP \fBEFAULT\fP La mémoire décrite par \fIlocal_iov\fP est en dehors de l'espace d'adressage de l'appelant. .TP \fBEFAULT\fP La mémoire décrite par \fIremote_iov\fP est en dehors de l'espace d'adressage du processus \fIpid\fP. .TP \fBEINVAL\fP La somme des valeurs \fIiov_len\fP de \fIlocal_iov\fP ou \fIremote_iov\fP dépasse une valeur \fIssize_t\fP. .TP \fBEINVAL\fP \fIflags\fP n'est pas 0. .TP \fBEINVAL\fP \fIliovcnt\fP ou \fIriovcnt\fP sont trop grands. .TP \fBENOMEM\fP Impossible d'allouer de la mémoire pour les copies internes de structures \fIiovec\fP. .TP \fBEPERM\fP L'appelant n'a pas le droit d'accéder à l'espace d'adressage du processus \fIpid\fP. .TP \fBESRCH\fP Aucun processus n'existe avec l'identifiant \fIpid\fP. .SH VERSIONS Ces appels système ont été ajoutés à Linux\ 3.2. La glibc les gère depuis la version\ 2.15. .SH CONFORMITÉ Ces appels système sont des extensions spécifiques à Linux. .SH NOTES Les transferts de données réalisés par \fBprocess_vm_readv\fP() et \fBprocess_vm_writev\fP() ne sont pas garantis être atomiques en aucune façon. .PP .\" Original user is MPI, http://www.mcs.anl.gov/research/projects/mpi/ .\" See also some benchmarks at http://lwn.net/Articles/405284/ .\" and http://marc.info/?l=linux-mm&m=130105930902915&w=2 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\ »)). .SH EXEMPLES Le code suivant montre l'utilisation de \fBprocess_vm_readv\fP(). Il lit 20\ octets à l'adresse\ 0x10000 du processus de PID\ 10 et écrit les 10 premiers octets dans \fItamp1\fP et les 10\ octets suivants dans \fItamp2\fP. .PP .EX #include int main(void) { struct iovec local[2]; struct iovec remote[1]; char tamp1[10]; char tamp2[10]; ssize_t nread; pid_t pid = 10; /* PID du processus distant */ 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) return 1; else return 0; } .EE .SH "VOIR AUSSI" \fBreadv\fP(2), \fBwritev\fP(2) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .