get_robust_list(2) System Calls Manual get_robust_list(2)

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

Biblioteca C standard (libc, -lc)

#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 *len_ptr);
long syscall(SYS_set_robust_list,
             struct robust_list_head *head, size_t len);

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

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

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 len trebuie să fie sizeof(*head).

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.

Apelul de sistem set_robust_list() poate eșua cu următoarea eroare:

len nu este egal cu sizeof(struct robust_list_head).

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

Antetul listei futex robuste nu poate fi stocat în locația head.
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.
Nu a putut fi găsit niciun fir cu ID-ul firului pid.

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

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

futex(2), pthread_mutexattr_setrobust(3)

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

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.

31 octombrie 2023 Pagini de manual de Linux 6.06