process_vm_readv(2)

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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.