sem_overview(7) Miscellaneous Information Manual sem_overview(7)

sem_overview - prezentare generală a semafoarelor POSIX

Semafoarele POSIX permit proceselor și firelor de execuție să își sincronizeze acțiunile.

Un semafor este un număr întreg a cărui valoare nu este permisă niciodată să scadă sub zero. Se pot efectua două operații asupra semafoarelor: creșterea valorii semafoarelor cu unu (sem_post(3)); și descreșterea valorii semafoarelor cu unu (sem_wait(3)). În cazul în care valoarea unui semafor este în prezent zero, atunci o operațiune sem_wait(3) se blochează până când valoarea devine mai mare decât zero.

Semafoarele POSIX se prezintă sub două forme: semafoare cu nume și semafoare fără nume.

Un semafor cu nume este identificat printr-un nume de forma /nume-oarecare; adică un șir de până la NAME_MAX-4 (adică 251) de caractere cu terminație nulă, format dintr-o bară oblică inițială, urmată de unul sau mai multe caractere, dintre care niciunul nu este o bară oblică. Două procese pot funcționa pe același semafor cu nume, trecând același nume la sem_open(3).
Funcția sem_open(3) creează un nou semafor cu nume sau deschide un semafor cu nume existent. După ce semaforul a fost deschis, acesta poate fi operat cu ajutorul funcțiilor sem_post(3) și sem_wait(3). Atunci când un proces a terminat de utilizat semaforul, acesta poate utiliza sem_close(3) pentru a închide semaforul. Atunci când toate procesele au terminat de utilizat semaforul, acesta poate fi eliminat din sistem folosind sem_unlink(3).
Un semafor fără nume nu are un nume. În schimb, semaforul este plasat într-o regiune de memorie care este partajată între mai multe fire de execuție (un semafor thread-shared semaphore) sau procese (un semafor process-shared semaphore). Un semafor partajat de fire este plasat într-o zonă de memorie partajată între firele unui proces, de exemplu, o variabilă globală. Un semafor partajat de proces trebuie plasat într-o regiune de memorie partajată (de exemplu, un segment de memorie partajată System V creat cu ajutorul shmget(2) sau un obiect de memorie partajată POSIX creat cu ajutorul shm_open(3)).
Înainte de a fi utilizat, un semafor fără nume trebuie inițializat cu ajutorul sem_init(3). Acesta poate fi apoi operat cu ajutorul sem_post(3) și sem_wait(3). Atunci când nu mai este necesar și înainte ca memoria în care este localizat să fie eliberată, semaforul trebuie distrus folosind sem_destroy(3).

Restul acestei secțiuni descrie câteva detalii specifice ale implementării în Linux a semafoarelor POSIX.

Înainte de Linux 2.6, Linux a acceptat doar semafoare fără nume, partajate pe fire de execuție. Într-un sistem cu Linux 2.6 și o bibliotecă „glibc” care oferă implementarea NPTL a firelor de execuție, este furnizată o implementare completă a semafoarelor POSIX.

Semafoarele POSIX cu nume sunt persistente în nucleu: dacă nu este eliminat de sem_unlink(3), un semafor va exista până la închiderea sistemului.

Programele care utilizează API-ul POSIX pentru semafoare trebuie compilate cu cc -pthread pentru a face legătura cu biblioteca „în timp real”, librt.

În Linux, semafoarele cu nume sunt create într-un sistem de fișiere virtual, montat în mod normal sub /dev/shm, cu nume de forma sem.nume-oarecare (acesta este motivul pentru care numele de semafoare sunt limitate la NAME_MAX-4, mai degrabă decât la NAME_MAX caractere).

Începând cu Linux 2.6.19, se pot plasa ACL-uri pe fișierele din acest director, pentru a controla permisiunile obiectelor pentru fiecare utilizator și grup în parte.

Semafoarele din System V (semget(2), semop(2) etc.) reprezintă o API de semafoare mai veche. Semafoarele POSIX oferă o interfață mai simplă și mai bine concepută decât semafoarele System V; pe de altă parte, semafoarele POSIX sunt mai puțin disponibile pe scară largă (în special pe sistemele mai vechi) decât semafoarele System V.

Un exemplu de utilizare a diferitelor funcții de semaforizare POSIX este prezentat în sem_wait(3).

sem_close(3), sem_destroy(3), sem_getvalue(3), sem_init(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3), pthreads(7), shm_overview(7)

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