.\" -*- 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 "23 iulie 2024" "Pagini de manual de Linux 6.12" .SH NUME process_vm_readv, process_vm_writev \- transferă date între spațiile de adrese ale proceselor .SH BIBLIOTECA Biblioteca C standard (\fIlibc\fP, \fI\-lc\fP) .SH SINOPSIS .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 Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați \fBfeature_test_macros\fP(7)): .RE .P \fBprocess_vm_readv\fP(), \fBprocess_vm_writev\fP(): .nf _GNU_SOURCE .fi .SH DESCRIERE Aceste apeluri de sistem transferă date între spațiul de adrese al procesului apelant („procesul local”) și procesul identificat prin \fIpid\fP („procesul la distanță”). Datele se deplasează direct între spațiile de adrese ale celor două procese, fără a trece prin spațiul nucleului. .P Apelul de sistem \fBprocess_vm_readv\fP() transferă date de la procesul la distanță la procesul local. Datele care urmează să fie transferate sunt identificate prin \fIremote_iov\fP și \fIriovcnt\fP: \fIremote_iov\fP este un indicator către o matrice care descrie intervalele de adrese din procesul \fIpid\fP, iar \fIriovcnt\fP specifică numărul de elemente din \fIremote_iov\fP. Datele sunt transferate în locațiile specificate de \fIlocal_iov\fP și \fIliovcnt\fP: \fIlocal_iov\fP este un indicator către o matrice care descrie intervalele de adrese din procesul apelant, iar \fIliovcnt\fP specifică numărul de elemente din \fIlocal_iov\fP. .P Apelul de sistem \fBprocess_vm_writev\fP() este inversul lui \fBprocess_vm_readv\fP()\[em]it transferă date de la procesul local la procesul la distanță. În afară de direcția transferului, argumentele \fIliovcnt\fP, \fIlocal_iov\fP, \fIriovcnt\fP și \fIremote_iov\fP au aceeași semnificație ca pentru \fBprocess_vm_readv\fP(). .P Argumentele \fIlocal_iov\fP și \fIremote_iov\fP indică o matrice de structuri \fIiovec\fP, descrise în \fBiovec\fP(3type). .P Memoriile tampon sunt procesate în ordinea matricei. Aceasta înseamnă că \fBprocess_vm_readv\fP() umple complet \fIlocal_iov[0]\fP înainte de a trece la \fIlocal_iov[1]\fP și așa mai departe. De asemenea, \fIremote_iov[0]\fP este citit complet înainte de a trece la \fIremote_iov[1]\fP, și așa mai departe. .P În mod similar, \fBprocess_vm_writev\fP() scrie întregul conținut al \fIlocal_iov[0]\fP înainte de a trece la \fIlocal_iov[1]\fP și umple complet \fIremote_iov[0]\fP înainte de a trece la \fIremote_iov[1]\fP. .P Lungimile \fIremote_iov[i].iov_len\fP și \fIlocal_iov[i].iov_len\fP nu trebuie să fie aceleași. Astfel, este posibilă împărțirea unei singure memorii tampon locale în mai multe memorii tampon la distanță sau viceversa. .P Argumentul \fIflags\fP nu este utilizat în prezent și trebuie definit la 0. .P .\" In time, glibc might provide a wrapper that works around this limit, .\" as is done for readv()/writev() Valorile specificate în argumentele \fIliovcnt\fP și \fIriovcnt\fP trebuie să fie mai mici sau egale cu \fBIOV_MAX\fP (definit în \fI\fP sau accesibil prin apelul \fIsysconf(_SC_IOV_MAX)\fP). .P Argumentele de numărare și \fIlocal_iov\fP sunt verificate înainte de efectuarea oricărui transfer. Dacă numerele sunt prea mari, sau \fIlocal_iov\fP nu este valid, sau adresele se referă la regiuni care sunt inaccesibile procesului local, niciunul dintre vectori nu va fi procesat și se va returna imediat o eroare. .P Rețineți, totuși, că aceste apeluri de sistem nu verifică regiunile de memorie din procesul la distanță decât chiar înainte de a efectua citirea/scrierea. În consecință, poate rezulta o citire/scriere parțială (a se vedea VALOAREA RETURNATĂ) dacă unul dintre elementele \fIremote_iov\fP indică o regiune de memorie nevalidă în procesul de la distanță. Nu se va încerca nicio altă citire/scriere dincolo de acel punct. Țineți cont de acest lucru atunci când încercați să citiți date de lungime necunoscută (cum ar fi șiruri de caractere C cu terminație nulă) dintr\-un proces la distanță, evitând acoperirea paginilor de memorie (de obicei 4\ Kio) într\-un singur element \fIiovec\fP la distanță. În schimb, împărțiți citirea de la distanță în două elemente \fIremote_iov\fP și faceți\-le să fuzioneze înapoi într\-o singură intrare de scriere \fIlocal_iov\fP. Prima intrare de citire merge până la limita paginii, în timp ce a doua începe la următoarea limită a paginii. .P Permisiunea de a citi din sau de a scrie într\-un alt proces este guvernată de o verificare a modului de acces ptrace \fBPTRACE_MODE_ATTACH_REALCREDS\fP; a se vedea \fBptrace\fP(2). .SH "VALOAREA RETURNATĂ" În caz de succes, \fBprocess_vm_readv\fP() returnează numărul de octeți citiți și \fBprocess_vm_writev\fP() returnează numărul de octeți scriși. Această valoare returnată poate fi mai mică decât numărul total de octeți solicitați, dacă a avut loc o citire/scriere parțială. Transferurile parțiale se aplică la granularitatea elementelor \fIiovec\fP; aceste apeluri de sistem nu vor efectua un transfer parțial care împarte un singur element \fIiovec\fP. Apelantul trebuie să verifice valoarea returnată pentru a determina dacă a avut loc o citire/scriere parțială. .P În caz de eroare, se returnează \-1, iar \fIerrno\fP este configurată pentru a indica eroarea. .SH ERORI\-IEȘIRE .TP \fBEFAULT\fP Memoria descrisă de \fIlocal_iov\fP este în afara spațiului de adrese accesibil apelantului. .TP \fBEFAULT\fP Memoria descrisă de \fIremote_iov\fP este în afara spațiului de adrese accesibil procesului \fIpid\fP. .TP \fBEINVAL\fP Suma valorilor \fIiov_len\fP din \fIlocal_iov\fP sau \fIremote_iov\fP depășește o valoare \fIssize_t\fP. .TP \fBEINVAL\fP \fIfanioane\fP(flags) nu este 0. .TP \fBEINVAL\fP \fIliovcnt\fP sau \fIriovcnt\fP este prea mare. .TP \fBENOMEM\fP Nu s\-a putut aloca memorie pentru copiile interne ale structurilor \fIiovec\fP. .TP \fBEPERM\fP Apelantul nu are permisiunea de a accesa spațiul de adrese al procesului \fIpid\fP. .TP \fBESRCH\fP Nu există niciun proces cu ID \fIpid\fP. .SH STANDARDE Linux. .SH ISTORIC Linux 3.2, glibc 2.15. .SH NOTE Transferurile de date efectuate de \fBprocess_vm_readv\fP() și \fBprocess_vm_writev\fP() nu sunt garantate în niciun fel a fi atomice. .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 Aceste apeluri de sistem au fost concepute pentru a permite trecerea rapidă a mesajelor, permițând schimbul de mesaje cu o singură operație de copiere (mai degrabă decât dubla copiere care ar fi necesară atunci când se utilizează, de exemplu, memoria partajată sau conductele). .SH EXEMPLE Următorul exemplu de cod demonstrează utilizarea \fBprocess_vm_readv\fP(). Acesta citește 20 de octeți la adresa 0x10000 de la procesul cu PID 10 și scrie primii 10 octeți în \fIbuf1\fP și următorii 10 octeți în \fIbuf2\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\-ul procesului de la distanță */ 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 "CONSULTAȚI ȘI" \fBreadv\fP(2), \fBwritev\fP(2) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .