get_robust_list(2)

NUME
get_robust_list, set_robust_list - obține/stabilește lista de futex-uri robuste

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <linux/futex.h>   /* Definiția lui struct robust_list_head */
#include <sys/syscall.h>   /* Definirea constantelor SYS_* */
#include <unistd.h>

long syscall(SYS_get_robust_list, int pid,
             struct robust_list_head **head_ptr, size_t *sizep);
long syscall(SYS_set_robust_list,
             struct robust_list_head *head, size_t size);

Notă: Nu există nicio funcție învăluitoare (wrapper) glibc pentru aceste apeluri de sistem astfel că este necesară utilizarea a syscall(2).

DESCRIERE
Aceste apeluri de sistem se ocupă de listele futex robuste pentru fiecare fir. Aceste liste sunt gestionate în spațiul utilizatorului: nucleul știe doar despre locația antetului listei. Un fir de execuție poate informa nucleul cu privire la locația listei sale de futex-uri robuste folosind set_robust_list(). Adresa listei de futex-uri robuste a unui fir de execuție poate fi obținută folosind get_robust_list().

Scopul listei robuste de futex este de a se asigura că, în cazul în care un fir nu reușește din greșeală să deblocheze un futex înainte de a se termina sau de a apela execve(2), un alt fir care așteaptă acel futex este notificat că fostul proprietar al futexului a murit. Această notificare constă în două părți: bitul FUTEX_OWNER_DIED este activat în cuvântul futex, iar nucleul efectuează o operație futex(2) FUTEX_WAKE pe unul dintre firele care așteaptă futex-ul.

Apelul de sistem get_robust_list() returnează antetul listei futex robustă a firului al cărui ID de fir este specificat în pid. Dacă pid este 0, se returnează antetul listei pentru firul apelant. Antetul listei este stocat în locația indicată de head_ptr. Dimensiunea obiectului indicat de **head_ptr este stocată în sizep.

Permisiunea de a utiliza get_robust_list() este guvernată de o verificare a modului de acces ptrace PTRACE_MODE_READ_REALCREDS; a se vedea ptrace(2).

Apelul de sistem set_robust_list() solicită nucleului să înregistreze antetul listei de futex-uri robuste deținute de firul apelant. Argumentul head este antetul listei care trebuie înregistrat. Argumentul size trebuie să fie sizeof(*head).

VALOAREA RETURNATĂ
Apelurile de sistem set_robust_list() și get_robust_list() returnează zero atunci când operațiunea este reușită, iar în caz contrar un cod de eroare.

ERORI-IEȘIRE
Apelul de sistem set_robust_list() poate eșua cu următoarea eroare:

EINVAL
    size nu este egală cu sizeof(struct robust_list_head).

Apelul de sistem get_robust_list() poate eșua cu următoarele erori:

EFAULT
    Antetul listei futex robuste nu poate fi stocat în locația head.

EPERM
    Procesul care face apelul nu are permisiunea de a vedea lista robustă futex a firului cu ID-ul firului pid și nu are capacitatea CAP_SYS_PTRACE.

ESRCH
    Nu a putut fi găsit niciun fir cu ID-ul firului pid.

VERSIUNI
Aceste apeluri de sistem au fost adăugate în Linux 2.6.17.

NOTE
Aceste apeluri de sistem nu sunt necesare pentru aplicațiile normale.

Un fir de execuție poate avea doar o singură listă de futex-uri robuste; prin urmare, aplicațiile care doresc să utilizeze această funcționalitate ar trebui să folosească mutex-urile robuste furnizate de glibc.

În implementarea inițială, un fir de execuție care aștepta un futex era notificat că proprietarul acestuia a murit numai dacă proprietarul se termina. Începând cu Linux 2.6.28, notificarea a fost extinsă pentru a include cazul în care proprietarul efectuează un execve(2).

ID-urile de fire menționate în textul principal sunt ID-uri de fire kernel de tipul celor returnate de clone(2) și gettid(2).

CONSULTAȚI ȘI
futex(2), pthread_mutexattr_setrobust(3)

Documentation/robust-futexes.rst și Documentation/robust-futex-ABI.rst în arborele sursă al nucleului Linux

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.