set_tid_address(2) System Calls Manual set_tid_address(2)

set_tid_address - definește indicatorul la ID-ul firului de execuție

Biblioteca C standard (libc, -lc)

#include <sys/syscall.h>      /* Definirea constantelor SYS_* */
#include <unistd.h>
pid_t syscall(SYS_set_tid_address, int *tidptr);

Notă: glibc nu oferă nicio funcție învăluitoare pentru set_tid_address(), fiind necesară utilizarea syscall(2).

Pentru fiecare fir, nucleul păstrează două atribute (adrese) numite set_child_tid și clear_child_tid. Aceste două atribute conțin în mod implicit valoarea NULL.

În cazul în care un fir de execuție este inițiat utilizând clone(2) cu indicatorul CLONE_CHILD_SETTID, set_child_tid este definit la valoarea transmisă în argumentul ctid al acestui apel de sistem.
Atunci când set_child_tid este definit, primul lucru pe care îl face noul fir de execuție este să își scrie ID-ul firului de execuție la această adresă.
Dacă un fir de execuție este inițiat utilizând clone(2) cu indicatorul CLONE_CHILD_CLEARTID, clear_child_tid este definit la valoarea transmisă în argumentul ctid al acelui apel de sistem.

Apelul de sistem set_tid_address() stabilește valoarea clear_child_tid pentru firul apelant la tidptr.

Atunci când se termină un fir de execuție al cărui clear_child_tid nu este NULL, atunci, dacă firul de execuție împarte memoria cu alte fire de execuție, atunci se scrie 0 la adresa specificată în clear_child_tid, iar nucleul efectuează următoarea operație:


futex(clear_child_tid, FUTEX_WAKE, 1, NULL, NULL, 0);

Efectul acestei operații este de a trezi un singur fir care efectuează o așteptare „futex” la locația din memorie. Erorile din operația de trezire „futex” sunt ignorate.

set_tid_address() returnează întotdeauna ID-ul firului de execuție al apelantului.

set_tid_address() reușește întotdeauna.

Linux.

Linux 2.5.48.

Detaliile prezentate aici sunt valabile începând cu Linux 2.5.49.

clone(2), futex(2), gettid(2)

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