Provided by: manpages-ro-dev_4.27.0-1_all bug

NUME

       process_vm_readv, process_vm_writev - transferă date între spațiile de adrese ale proceselor

BIBLIOTECA

       Biblioteca C standard (libc, -lc)

SINOPSIS

       #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);

   Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

       process_vm_readv(), process_vm_writev():
           _GNU_SOURCE

DESCRIERE

       Aceste  apeluri de sistem transferă date între spațiul de adrese al procesului apelant („procesul local”)
       și procesul identificat prin pid („procesul la distanță”). Datele se deplasează direct între spațiile  de
       adrese ale celor două procese, fără a trece prin spațiul nucleului.

       Apelul  de  sistem process_vm_readv() transferă date de la procesul la distanță la procesul local. Datele
       care urmează să fie transferate  sunt  identificate  prin  remote_iov  și  riovcnt:  remote_iov  este  un
       indicator  către  o  matrice  care  descrie intervalele de adrese din procesul pid, iar riovcnt specifică
       numărul de elemente din remote_iov.  Datele sunt transferate în locațiile  specificate  de  local_iov  și
       liovcnt:  local_iov  este  un  indicator  către o matrice care descrie intervalele de adrese din procesul
       apelant, iar liovcnt specifică numărul de elemente din local_iov.

       Apelul de sistem process_vm_writev()  este  inversul  lui  process_vm_readv()—it  transferă  date  de  la
       procesul  local  la  procesul  la  distanță.  În  afară  de  direcția  transferului, argumentele liovcnt,
       local_iov, riovcnt și remote_iov au aceeași semnificație ca pentru process_vm_readv().

       Argumentele local_iov și remote_iov indică o matrice de structuri iovec, descrise în iovec(3type).

       Memoriile tampon sunt procesate în ordinea matricei. Aceasta înseamnă că process_vm_readv() umple complet
       local_iov[0] înainte de a trece la local_iov[1] și așa mai departe. De asemenea, remote_iov[0] este citit
       complet înainte de a trece la remote_iov[1], și așa mai departe.

       În mod similar, process_vm_writev() scrie întregul  conținut  al  local_iov[0]  înainte  de  a  trece  la
       local_iov[1] și umple complet remote_iov[0] înainte de a trece la remote_iov[1].

       Lungimile remote_iov[i].iov_len și local_iov[i].iov_len 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.

       Argumentul flags nu este utilizat în prezent și trebuie definit la 0.

       Valorile  specificate  în  argumentele  liovcnt  și  riovcnt trebuie să fie mai mici sau egale cu IOV_MAX
       (definit în <limits.h> sau accesibil prin apelul sysconf(_SC_IOV_MAX)).

       Argumentele de numărare și local_iov sunt  verificate  înainte  de  efectuarea  oricărui  transfer.  Dacă
       numerele  sunt  prea  mari,  sau  local_iov  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.

       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  remote_iov  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 iovec la distanță. În schimb, împărțiți citirea de  la  distanță
       în două elemente remote_iov și faceți-le să fuzioneze înapoi într-o singură intrare de scriere local_iov.
       Prima  intrare  de  citire  merge până la limita paginii, în timp ce a doua începe la următoarea limită a
       paginii.

       Permisiunea de a citi din sau de a scrie într-un alt proces este guvernată de o verificare a  modului  de
       acces ptrace PTRACE_MODE_ATTACH_REALCREDS; a se vedea ptrace(2).

VALOAREA RETURNATĂ

       În  caz  de  succes,  process_vm_readv()  returnează  numărul  de  octeți  citiți  și process_vm_writev()
       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 iovec; aceste apeluri de sistem  nu  vor  efectua  un  transfer  parțial  care
       împarte un singur element iovec. Apelantul trebuie să verifice valoarea returnată pentru a determina dacă
       a avut loc o citire/scriere parțială.

       În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

       EFAULT Memoria descrisă de local_iov este în afara spațiului de adrese accesibil apelantului.

       EFAULT Memoria descrisă de remote_iov este în afara spațiului de adrese accesibil procesului pid.

       EINVAL Suma valorilor iov_len din local_iov sau remote_iov depășește 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 spațiul de adrese al procesului pid.

       ESRCH  Nu există 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 în niciun
       fel a fi atomice.

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

EXEMPLE

       Următorul exemplu de cod demonstrează utilizarea process_vm_readv().  Acesta  citește  20  de  octeți  la
       adresa 0x10000 de la procesul cu PID 10 și scrie primii 10 octeți în buf1 și următorii 10 octeți în buf2.

       #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-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);
       }

CONSULTAȚI ȘI

       readv(2), writev(2)

TRADUCERE

       Traducerea    în   limba   română   a   acestui   manual   a   fost   făcută   de   Remus-Gabriel   Chelu
       <remusgabriel.chelu@disroot.org>

       Această traducere este  documentație  gratuită;  citiți  Licența publică generală GNU Versiunea 3  sau  o
       versiune   ulterioară   cu  privire  la  condiții  privind  drepturile  de  autor.   NU  se  asumă  NICIO
       RESPONSABILITATE.

       Dacă găsiți erori în traducerea acestui manual, vă rugăm să  trimiteți  un  e-mail  la  translation-team-
       ro@lists.sourceforge.net.

Pagini de manual de Linux 6.9.1                    2 mai 2024                                process_vm_readv(2)