.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2011 Christopher Yeoh .\" and Copyright (C) 2012 Mike Frysinger .\" and Copyright (C) 2012 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Commit fcf634098c00dd9cd247447368495f0b79be12d1 .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH process_vm_readv 2 "2 mai 2024" "Pages du manuel de Linux 6.8" .SH NOM process_vm_readv, process_vm_writev \- Transférer les données entre les espaces d'adressage de processus .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .P \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 \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 .P .RS -4 Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7)) : .RE .P \fBprocess_vm_readv\fP(), \fBprocess_vm_writev\fP() : .nf _GNU_SOURCE .fi .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. .P 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. .P 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(). .P Les arguments \fIlocal_iov\fP et \fIremote_iov\fP pointent vers un tableau de structures \fIiovec\fP, définies dans \fBiovec\fP(3type). .P 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. .P 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. .P 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. .P L'argument \fIflags\fP n'est pour l'instant pas utilisé et doit être configuré à 0. .P .\" 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). .P 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. .P 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). .P 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. .P En cas d'erreur, la valeur de retour est \fB\-1\fP et \fIerrno\fP est définie pour préciser l'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 STANDARDS Linux. .SH HISTORIQUE Linux 3.2, glibc 2.15. .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. .P .\" 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. .P .\" SRC BEGIN (process_vm_readv.c) .EX #define _GNU_SOURCE #include #include #include \& 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); } .EE .\" SRC END .SH "VOIR AUSSI" \fBreadv\fP(2), \fBwritev\fP(2) .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 .