Man page - process_vm_readv(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

process_vm_readv

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION

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 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 .