sigwaitinfo(2)

NUME
sigwaitinfo, sigtimedwait, rt_sigtimedwait - așteaptă în mod sincron pentru semnalele din coada de așteptare

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <signal.h>

int sigwaitinfo(const sigset_t *restrict set,
                siginfo_t *_Nullable restrict info);
int sigtimedwait(const sigset_t *restrict set,
                siginfo_t *_Nullable restrict info,
                const struct timespec *restrict timeout);

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

sigwaitinfo(), sigtimedwait():
    _POSIX_C_SOURCE >= 199309L

DESCRIERE
sigwaitinfo() suspendă execuția firului apelant până când unul dintre semnalele din set este în așteptare; (dacă unul dintre semnalele din set este deja în așteptare pentru firul apelant, sigwaitinfo() returnează imediat).

sigwaitinfo() elimină semnalul din setul de semnale în așteptare și returnează numărul semnalului ca rezultat al funcției sale. Dacă argumentul siginfo nu este NULL, atunci memoria tampon la care acesta indică este utilizată pentru a returna o structură de tip siginfo_t (a se vedea sigaction(2)) care conține informații despre semnal.

În cazul în care mai multe semnale din set sunt în așteptare pentru apelant, semnalul care este recuperat de sigwaitinfo() este determinat în conformitate cu regulile obișnuite de ordonare; a se vedea signal(7) pentru mai multe detalii.

sigtimedwait() funcționează exact în același mod ca și sigwaitinfo(), cu excepția faptului că are un argument suplimentar, timeout, care specifică intervalul pentru care firul este suspendat în așteptarea unui semnal; (acest interval va fi rotunjit la granularitatea (gradul de finețe al) ceasului de sistem, iar întârzierile de programare ale nucleului înseamnă că intervalul poate fi depășit cu o mică cantitate). Acest argument este o structură timespec(3).

În cazul în care ambele câmpuri ale acestei structuri sunt specificate ca fiind 0, se efectuează un sondaj: sigtimedwait() revine imediat, fie cu informații despre un semnal care era în așteptare pentru apelant, fie cu o eroare dacă niciunul dintre semnalele din set nu era în așteptare.

VALOAREA RETURNATĂ
În caz de succes, atât sigwaitinfo(), cât și sigtimedwait() returnează un număr de semnal (adică o valoare mai mare decât zero). În caz de eșec, ambele apeluri returnează -1, cu errno configurată pentru a indica eroarea.

ERORI-IEȘIRE

EAGAIN
    Niciun semnal din set nu a devenit în așteptare în perioada timeout specificată la sigtimedwait().

EINTR
    Așteptarea a fost întreruptă de un gestionar de semnal; a se vedea signal(7); (acest gestionar era pentru un alt semnal decât unul dintre cele din set).

EINVAL
    timeout nu a fost valid.

VERSIUNI

  Diferențe între biblioteca C și nucleu
În Linux, sigwaitinfo() este o funcție de bibliotecă implementată pe lângă sigtimedwait().

Funcțiile glibc pentru sigwaitinfo() și sigtimedwait() ignoră în tăcere încercările de a aștepta cele două semnale în timp real care sunt utilizate în mod intern de către implementarea de fire de execuție „NPTL threading”. A se vedea nptl(7) pentru detalii.

Apelul de sistem original din Linux a fost numit sigtimedwait(). Cu toate acestea, odată cu adăugarea semnalelor în timp real în Linux 2.2, tipul de dimensiune fixă, pe 32 de biți sigset_t acceptat de acest apel de sistem nu mai era potrivit scopului. În consecință, a fost adăugat un nou apel de sistem, rt_sigtimedwait(), pentru a suporta un tip sigset_t mărit. Noul apel de sistem primește un al patrulea argument, size_t sigsetsize, care specifică dimensiunea în octeți a setului de semnale din set. În prezent, acest argument trebuie să aibă valoarea sizeof(sigset_t) (în caz contrar, apare eroarea EINVAL). Funcția de învăluire glibc sigtimedwait() ne ascunde aceste detalii, apelând în mod transparent rt_sigtimedwait() atunci când nucleul o furnizează.

STANDARDE
POSIX.1-2024.

ISTORIC
POSIX.1-2001.

NOTE
În mod normal, programul apelant blochează semnalele din set printr-un apel anterior la sigprocmask(2) (astfel încât dispoziția implicită pentru aceste semnale să nu apară dacă acestea devin în așteptare între apelurile succesive la sigwaitinfo() sau sigtimedwait()) și nu stabilește gestionari pentru aceste semnale. Într-un program cu mai multe fire de execuție, semnalul trebuie blocat în toate firele de execuție, pentru a preveni ca semnalul să fie tratat în conformitate cu dispoziția sa implicită într-un alt fir de execuție decât cel care apelează sigwaitinfo() sau sigtimedwait()).

Setul de semnale care este în așteptare pentru un anumit fir de execuție este uniunea dintre setul de semnale care este în așteptare în mod specific pentru acel fir de execuție și setul de semnale care este în așteptare pentru întregul proces (a se vedea signal(7)).

Încercările de a aștepta SIGKILL și SIGSTOP sunt ignorate în tăcere.

În cazul în care mai multe fire ale unui proces sunt blocate în așteptarea aceluiași semnal (semnale) în sigwaitinfo() sau sigtimedwait(), atunci exact unul dintre fire va primi efectiv semnalul dacă acesta devine în așteptare pentru întregul proces; care dintre fire primește semnalul este nedeterminat.

sigwaitinfo() sau sigtimedwait(), nu pot fi utilizate pentru a primi semnale care sunt generate în mod sincron, cum ar fi semnalul SIGSEGV care rezultă din accesarea unei adrese de memorie invalidă sau semnalul SIGFPE care rezultă dintr-o eroare aritmetică. Astfel de semnale pot fi recepționate numai prin intermediul unui gestionar de semnal.

POSIX lasă nespecificată semnificația unei valori NULL pentru argumentul timeout din sigtimedwait(), permițând posibilitatea ca acest lucru să aibă aceeași semnificație ca un apel la sigwaitinfo() și, într-adevăr, acest lucru este ceea ce se face sub Linux.

CONSULTAȚI ȘI
kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(3), sigsetops(3), sigwait(3), timespec(3), signal(7), time(7)

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.