process_vm_readv(2) System Calls Manual process_vm_readv(2) NOM process_vm_readv, process_vm_writev - Transferer les donnees entre les espaces d'adressage de processus BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include 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 fonctionnalites pour la glibc (consulter feature_test_macros(7)) : process_vm_readv(), process_vm_writev() : _GNU_SOURCE DESCRIPTION Ces appels systeme transferent des donnees entre l'espace d'adressage du processus d'appel (<< le processus local >>) et du processus identifie par pid (<< le processus distant >>). Les donnees se deplacent directement entre les espaces d'adressage des deux processus, sans passer par l'espace du noyau. L'appel systeme process_vm_readv() transfere les donnees du processus distant au processus local. Les donnees a transferer sont identifiees par remote_iov et riovcnt : remote_iov est un pointeur vers un tableau decrivant les intervalles d'adresses dans le processus pid et riovcnt indique le nombre d'elements dans remote_iov. Les donnees sont transferees aux endroits indiques par local_iov et liovcnt : local_iov est un pointeur vers un tableau decrivant les intervalles d'adresses dans le processus appelant et liovcnt indique le nombre d'elements dans local_iov. L'appel systeme process_vm_writev() fait l'inverse de process_vm_readv() -- il transfere les donnees du processus local au processus distant. A part la direction du transfert, les arguments liovcnt, local_iov, riovcnt et remote_iov ont la meme signification qu'avec process_vm_readv(). Les arguments local_iov et remote_iov pointent vers un tableau de structures iovec, definies dans iovec(3type). Les tampons sont traites dans l'ordre du tableau. Cela signifie que process_vm_readv() remplit completement local_iov[0] avant de passer a local_iov[1], etc. De meme, remote_iov[0] est completement lu avant de passer a remote_iov[1], etc. De meme, process_vm_writev() ecrit tout le contenu de local_iov[0] avant de passer a local_iov[1], et il remplit completement remote_iov[0] avant de passer a remote_iov[1]. Les longueurs de remote_iov[i].iov_len et local_iov[i].iov_len n'ont pas besoin d'etre identiques. Ainsi, il est possible de separer un seul tampon local en plusieurs tampons distants, ou vice versa. L'argument flags n'est pour l'instant pas utilise et doit etre configure a 0. Les valeurs indiquees dans les arguments liovcnt et riovcnt doivent etre inferieures a IOV_MAX (definie dans ou accessibles par l'appel sysconf(_SC_IOV_MAX)). Les arguments de decompte et local_iov sont verifies avant tout transfert. Si le decompte est trop grand, que local_iov n'est pas valable ou que les adresses font reference a des regions inaccessibles au processus local, aucun des vecteurs ne sera traite et une erreur sera immediatement renvoyee. Remarquez cependant que ces appels systeme ne verifient les regions de memoire dans le processus distant que juste avant la lecture ou l'ecriture. Par consequent, une lecture ou ecriture partielle (consultez VALEUR RENVOYEE) pourrait avoir comme resultat un des elements remote_iov pointant vers une region de memoire non valable dans le processus distant. Aucune lecture ou ecriture supplementaires ne seront tentees apres cela. Gardez cela a l'esprit lors d'une tentative de lecture de donnees de longueur inconnue (comme des chaines C qui se terminent par un caractere NULL) depuis un processus distant, en evitant de s'etendre sur les pages memoire (en general 4 Kio) dans un seul element iovec distant (a la place, separez la lecture distante en deux elements remote_iov a fusionner ensuite dans une seule entree local_iov. La premiere entree lue s'arrete a la frontiere de page, tandis que la seconde commence a la frontiere de page suivante). Le droit d'ecriture ou de lecture d'un autre processus est gere par une verification PTRACE_MODE_ATTACH_REALCREDS du mode d'acces de ptrace ; voir ptrace(2). VALEUR RENVOYEE En cas de reussite, process_vm_readv() renvoie le nombre d'octets lus et process_vm_writev() renvoie le nombre d'octets ecrits. Cette valeur renvoyee pourrait etre inferieure au nombre total d'octets demandes si une lecture ou ecriture partielle est survenue (les transferts partiels s'appliquent a la granularite des elements iovec. Ces appels systemes ne realiseront pas de transfert partiel qui separe un seul element iovec). L'appelant devrait verifier la valeur renvoyee pour determiner si une lecture ou ecriture partielle est survenue. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. ERREURS EFAULT La memoire decrite par local_iov est en dehors de l'espace d'adressage de l'appelant. EFAULT La memoire decrite 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 depasse une valeur ssize_t. EINVAL flags n'est pas 0. EINVAL liovcnt ou riovcnt sont trop grands. ENOMEM Impossible d'allouer de la memoire pour les copies internes de structures iovec. EPERM L'appelant n'a pas le droit d'acceder a 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 donnees realises par process_vm_readv() et process_vm_writev() ne sont pas garantis etre atomiques en aucune facon. Ces appels systeme ont ete concus pour permettre la transmission rapide de messages en autorisant l'echange de messages avec une seul operation de copie (plutot que la double copie qui serait necessaire en utilisant, par exemple, la memoire partagee ou les tubes (<< pipes >>)). EXEMPLES Le code suivant montre l'utilisation de process_vm_readv(). Il lit 20 octets a l'adresse 0x10000 du processus de PID 10 et ecrit les 10 premiers octets dans tamp1 et les 10 octets suivants dans tamp2. #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); } VOIR AUSSI readv(2), writev(2) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 process_vm_readv(2)