process_vm_readv(2) System Calls Manual process_vm_readv(2) NUME process_vm_readv, process_vm_writev - transfera date intre spaiile de adrese ale proceselor BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #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); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): process_vm_readv(), process_vm_writev(): _GNU_SOURCE DESCRIERE Aceste apeluri de sistem transfera date intre spaiul de adrese al procesului apelant (,,procesul local") i procesul identificat prin pid (,,procesul la distana"). Datele se deplaseaza direct intre spaiile de adrese ale celor doua procese, fara a trece prin spaiul nucleului. Apelul de sistem process_vm_readv() transfera date de la procesul la distana la procesul local. Datele care urmeaza sa fie transferate sunt identificate prin remote_iov i riovcnt: remote_iov este un indicator catre o matrice care descrie intervalele de adrese din procesul pid, iar riovcnt specifica numarul de elemente din remote_iov. Datele sunt transferate in locaiile specificate de local_iov i liovcnt: local_iov este un indicator catre o matrice care descrie intervalele de adrese din procesul apelant, iar liovcnt specifica numarul de elemente din local_iov. Apelul de sistem process_vm_writev() este inversul lui process_vm_readv()--it transfera date de la procesul local la procesul la distana. In afara de direcia transferului, argumentele liovcnt, local_iov, riovcnt i remote_iov au aceeai semnificaie ca pentru process_vm_readv(). Argumentele local_iov i remote_iov indica o matrice de structuri iovec, descrise in iovec(3type). Memoriile tampon sunt procesate in ordinea matricei. Aceasta inseamna ca process_vm_readv() umple complet local_iov[0] inainte de a trece la local_iov[1] i aa mai departe. De asemenea, remote_iov[0] este citit complet inainte de a trece la remote_iov[1], i aa mai departe. In mod similar, process_vm_writev() scrie intregul coninut al local_iov[0] inainte de a trece la local_iov[1] i umple complet remote_iov[0] inainte de a trece la remote_iov[1]. Lungimile remote_iov[i].iov_len i local_iov[i].iov_len nu trebuie sa fie aceleai. Astfel, este posibila imparirea unei singure memorii tampon locale in mai multe memorii tampon la distana sau viceversa. Argumentul flags nu este utilizat in prezent i trebuie definit la 0. Valorile specificate in argumentele liovcnt i riovcnt trebuie sa fie mai mici sau egale cu IOV_MAX (definit in sau accesibil prin apelul sysconf(_SC_IOV_MAX)). Argumentele de numarare i local_iov sunt verificate inainte de efectuarea oricarui transfer. Daca numerele sunt prea mari, sau local_iov nu este valid, sau adresele se refera la regiuni care sunt inaccesibile procesului local, niciunul dintre vectori nu va fi procesat i se va returna imediat o eroare. Reinei, totui, ca aceste apeluri de sistem nu verifica regiunile de memorie din procesul la distana decat chiar inainte de a efectua citirea/scrierea. In consecina, poate rezulta o citire/scriere pariala (a se vedea VALOAREA RETURNATA) daca unul dintre elementele remote_iov indica o regiune de memorie nevalida in procesul de la distana. Nu se va incerca nicio alta citire/scriere dincolo de acel punct. inei cont de acest lucru atunci cand incercai sa citii date de lungime necunoscuta (cum ar fi iruri de caractere C cu terminaie nula) dintr-un proces la distana, evitand acoperirea paginilor de memorie (de obicei 4 Kio) intr-un singur element iovec la distana. In schimb, imparii citirea de la distana in doua elemente remote_iov i facei-le sa fuzioneze inapoi intr-o singura intrare de scriere local_iov. Prima intrare de citire merge pana la limita paginii, in timp ce a doua incepe la urmatoarea limita a paginii. Permisiunea de a citi din sau de a scrie intr-un alt proces este guvernata de o verificare a modului de acces ptrace PTRACE_MODE_ATTACH_REALCREDS; a se vedea ptrace(2). VALOAREA RETURNATA In caz de succes, process_vm_readv() returneaza numarul de octei citii i process_vm_writev() returneaza numarul de octei scrii. Aceasta valoare returnata poate fi mai mica decat numarul total de octei solicitai, daca a avut loc o citire/scriere pariala. Transferurile pariale se aplica la granularitatea elementelor iovec; aceste apeluri de sistem nu vor efectua un transfer parial care imparte un singur element iovec. Apelantul trebuie sa verifice valoarea returnata pentru a determina daca a avut loc o citire/scriere pariala. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EFAULT Memoria descrisa de local_iov este in afara spaiului de adrese accesibil apelantului. EFAULT Memoria descrisa de remote_iov este in afara spaiului de adrese accesibil procesului pid. EINVAL Suma valorilor iov_len din local_iov sau remote_iov depaete o valoare ssize_t. EINVAL fanioane(flags) nu este 0. EINVAL liovcnt sau riovcnt este prea mare. ENOMEM Nu s-a putut aloca memorie pentru copiile interne ale structurilor iovec. EPERM Apelantul nu are permisiunea de a accesa spaiul de adrese al procesului pid. ESRCH Nu exista niciun proces cu ID pid. STANDARDE Linux. ISTORIC Linux 3.2, glibc 2.15. NOTE Transferurile de date efectuate de process_vm_readv() i process_vm_writev() nu sunt garantate in niciun fel a fi atomice. Aceste apeluri de sistem au fost concepute pentru a permite trecerea rapida a mesajelor, permiand schimbul de mesaje cu o singura operaie de copiere (mai degraba decat dubla copiere care ar fi necesara atunci cand se utilizeaza, de exemplu, memoria partajata sau conductele). EXEMPLE Urmatorul exemplu de cod demonstreaza utilizarea process_vm_readv(). Acesta citete 20 de octei la adresa 0x10000 de la procesul cu PID 10 i scrie primii 10 octei in buf1 i urmatorii 10 octei in buf2. #define _GNU_SOURCE #include #include #include int main(void) { char buf1[10]; char buf2[10]; pid_t pid = 10; /* PID-ul procesului de la distana */ 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); } CONSULTAI I readv(2), writev(2) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.12 23 iulie 2024 process_vm_readv(2)