.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2006 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH sem_wait 3 "15 iunie 2024" "Pagini de manual de Linux 6.9.1" .SH NUME sem_wait, sem_timedwait, sem_trywait \- blochează un semafor .SH BIBLIOTECA Biblioteca de fire de execuție POSIX (\fIlibpthread\fP, \fI\-lpthread\fP) .SH SINOPSIS .nf \fB#include \fP .P \fBint sem_wait(sem_t *\fP\fIsem\fP\fB);\fP \fBint sem_trywait(sem_t *\fP\fIsem\fP\fB);\fP \fBint sem_timedwait(sem_t *restrict \fP\fIsem\fP\fB,\fP \fB const struct timespec *restrict \fP\fIabs_timeout\fP\fB);\fP .fi .P .RS -4 Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați \fBfeature_test_macros\fP(7)): .RE .P \fBsem_timedwait\fP(): .nf _POSIX_C_SOURCE >= 200112L .fi .SH DESCRIERE \fBsem_wait\fP() decrementează (blochează) semaforul indicat de \fIsem\fP. În cazul în care valoarea semaforului este mai mare decât zero, atunci decrementarea are loc, iar funcția returnează, imediat. În cazul în care semaforul are în prezent valoarea zero, apelul se blochează până când fie devine posibilă efectuarea decrementării (de exemplu, valoarea semaforului crește peste zero), fie un gestionar de semnal întrerupe apelul. .P \fBsem_trywait\fP() este la fel ca \fBsem_wait\fP(), cu excepția faptului că, dacă decrementarea nu poate fi efectuată imediat, apelul returnează o eroare (\fIerrno\fP este configurată la \fBEAGAIN\fP) în loc să blocheze. .P \fBsem_timedwait\fP() este la fel ca \fBsem_wait\fP(), cu excepția faptului că \fIabs_timeout\fP specifică o limită de timp în care apelul trebuie blocat dacă decrementarea nu poate fi efectuată imediat. Argumentul \fIabs_timeout\fP indică o structură \fBtimespec\fP(3) care specifică un timp de așteptare absolut în secunde și nanosecunde de la Epoch, 1970\-01\-01 00:00:00 +0000 (UTC). .P Dacă timpul de așteptare a expirat deja în momentul apelului, iar semaforul nu a putut fi blocat imediat, atunci \fBsem_timedwait\fP() eșuează cu o eroare de timp (\fIerrno\fP este configurată la \fBETIMEDOUT\fP). .P Dacă operația poate fi efectuată imediat, atunci \fBsem_timedwait\fP() nu eșuează niciodată cu o eroare de timp de așteptare, indiferent de valoarea lui \fIabs_timeout\fP. În plus, validitatea lui \fIabs_timeout\fP nu este verificată în acest caz. .SH "VALOAREA RETURNATĂ" Toate aceste funcții returnează 0 în caz de succes; în caz de eroare, valoarea semaforului rămâne neschimbată, se returnează \-1, iar \fIerrno\fP este configurată pentru a indica eroarea. .SH ERORI\-IEȘIRE .TP \fBEAGAIN\fP (\fBsem_trywait\fP()) Operația nu a putut fi efectuată fără blocare (de exemplu, semaforul are în prezent valoarea zero). .TP \fBEINTR\fP Apelul a fost întrerupt de un gestionar de semnal; a se vedea \fBsignal\fP(7). .TP \fBEINVAL\fP \fIsemafor\fP nu este un semafor valid. .TP \fBEINVAL\fP (\fBsem_timedwait\fP()) Valoarea \fIabs_timeout.tv_nsecs\fP este mai mică decât 0 sau mai mare sau egală cu 1000 de milioane. .TP \fBETIMEDOUT\fP .\" POSIX.1-2001 also allows EDEADLK -- "A deadlock condition .\" was detected", but this does not occur on Linux(?). (\fBsem_timedwait\fP()) Apelul a expirat înainte ca semaforul să poată fi blocat. .SH ATRIBUTE Pentru o explicație a termenilor folosiți în această secțiune, a se vedea \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interfață Atribut Valoare T{ .na .nh \fBsem_wait\fP(), \fBsem_trywait\fP(), \fBsem_timedwait\fP() T} Siguranța firelor MT\-Safe .TE .SH STANDARDE POSIX.1\-2008. .SH ISTORIC POSIX.1\-2001. .SH EXEMPLE Programul (oarecum trivial) prezentat mai jos operează pe un semafor fără nume. Programul așteaptă două argumente în linia de comandă. Primul argument specifică o valoare în secunde care este utilizată pentru a configura un temporizator de alarmă pentru a genera un semnal \fBSIGALRM\fP. Acest gestionar efectuează un \fBsem_post\fP(3) pentru a incrementa semaforul care este așteptat în \fImain()\fP utilizând \fBsem_timedwait\fP(). Al doilea argument din linia de comandă specifică lungimea timpului de așteptare, în secunde, pentru \fBsem_timedwait\fP(). Ceea ce urmează arată ce se întâmplă la două execuții diferite ale programului: .P .in +4n .EX $\fB ./a.out 2 3\fP În curs de apelare a sem_timedwait() sem_post() de la gestionar sem_timedwait() a reușit $\fB ./a.out 2 1\fP În curs de apelare a sem_timedwait() ssem_timedwait() a expirat .EE .in .SS "Sursa programului" .\" SRC BEGIN (sem_wait.c) \& .EX #include #include #include #include #include #include #include \& #include \& sem_t sem; \& #define handle_error(msg) \[rs] do { perror(msg); exit(EXIT_FAILURE); } while (0) \& static void handler(int sig) { write(STDOUT_FILENO, "sem_post() de la gestionar\[rs]n", 24); if (sem_post(&sem) == \-1) { write(STDERR_FILENO, "sem_post() a eșuat\[rs]n", 18); _exit(EXIT_FAILURE); } } \& int main(int argc, char *argv[]) { struct sigaction sa; struct timespec ts; int s; \& if (argc != 3) { fprintf(stderr, "Utilizare: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& if (sem_init(&sem, 0, 0) == \-1) handle_error("sem_init"); \& /* Stabilește gestionarul SIGALRM; fixează temporizatorul de alarmă utilizând argv[1]. */ \& sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) == \-1) handle_error("sigaction"); \& alarm(atoi(argv[1])); \& /* Calculează intervalul relativ ca timp curent plus numărul de secunde dat de argv[2]. */ \& if (clock_gettime(CLOCK_REALTIME, &ts) == \-1) handle_error("clock_gettime"); \& ts.tv_sec += atoi(argv[2]); \& printf("%s() pe cale să apeleze sem_timedwait()\[rs]n", __func__); while ((s = sem_timedwait(&sem, &ts)) == \-1 && errno == EINTR) continue; /* Repornește dacă este întrerupt de gestionar. */ \& /* Verifică ce s\-a întâmplat. */ \& if (s == \-1) { if (errno == ETIMEDOUT) printf("sem_timedwait() timed out\[rs]n"); else perror("sem_timedwait"); } else printf("sem_timedwait() a reușit\[rs]n"); \& exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE); } .EE .\" SRC END .SH "CONSULTAȚI ȘI" \fBclock_gettime\fP(2), \fBsem_getvalue\fP(3), \fBsem_post\fP(3), \fBtimespec\fP(3), \fBsem_overview\fP(7), \fBtime\fP(7) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .