signal(2) System Calls Manual signal(2) NUME signal - gestionarea semnalelor ANSI C BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); DESCRIERE ATENIE: comportamentul signal() variaza intre versiunile UNIX i a variat, de asemenea, de-a lungul timpului, intre diferitele versiuni de Linux. Evitai utilizarea sa: utilizai in schimb sigaction(2). A se vedea seciunea Portabilitate de mai jos. signal() stabilete dispoziia semnalului signum la handler, care este fie SIG_IGN, SIG_DFL, fie adresa unei funcii definite de programator (un ,,gestionar de semnal"). Daca semnalul signum este transmis procesului, atunci apare una dintre urmatoarele situaii: * Daca dispoziia este stabilita la SIG_IGN, atunci semnalul este ignorat. * Daca dispoziia este stabilita la SIG_DFL, atunci are loc aciunea implicita asociata cu semnalul (a se vedea signal(7)). * Daca dispoziia este stabilita la o funcie, atunci mai intai fie dispoziia este restabilita la SIG_DFL, fie semnalul este blocat (a se vedea seciunea Portabilitate de mai jos), iar apoi se apeleaza handler cu argumentul signum. In cazul in care invocarea gestionarului a cauzat blocarea semnalului, atunci semnalul se deblocheaza la returnarea gestionarului. Semnalele SIGKILL i SIGSTOP nu pot fi capturate sau ignorate. VALOAREA RETURNATA signal() returneaza valoarea anterioara a gestionarului de semnal. In caz de eec, returneaza SIG_ERR, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EINVAL signum nu este valid. VERSIUNI Utilizarea lui sighandler_t este o extensie GNU, expusa daca este definita _GNU_SOURCE; glibc definete, de asemenea, sig_t (derivat din BSD) daca este definita _BSD_SOURCE (glibc 2.19 i versiunile anterioare) sau _DEFAULT_SOURCE (glibc 2.19 i versiunile ulterioare). Fara utilizarea unui astfel de tip, declaraia lui signal() este cu atat mai greu de citit: void ( *signal(int signum, void (*handler)(int)) ) (int); Portabilitate Singura utilizare portabila a signal() este de a stabili dispoziia unui semnal la SIG_DFL sau SIG_IGN. Semantica atunci cand se utilizeaza signal() pentru a stabili un gestionar de semnal variaza de la un sistem la altul (iar POSIX.1 permite in mod explicit aceasta variaie); nu o utilizai in acest scop.. POSIX.1 a rezolvat problema portabilitaii prin specificarea sigaction(2), care ofera un control explicit al semanticii atunci cand este invocat un gestionar de semnal; utilizai aceasta interfaa in loc de signal(). STANDARDE C11, POSIX.1-2008. ISTORIC C89, POSIX.1-2001. In sistemele UNIX originale, atunci cand un gestionar stabilit cu ajutorul signal() era invocat de livrarea unui semnal, dispoziia semnalului era restabilita la SIG_DFL, iar sistemul nu bloca livrarea altor instane ale semnalului. Acest lucru este echivalent cu apelarea sigaction(2) cu urmatoarele fanioane: sa.sa_flags = SA_RESETHAND | SA_NODEFER; System V ofera, de asemenea, aceasta semantica pentru signal(). Acest lucru era rau deoarece semnalul putea fi transmis din nou inainte ca operatorul sa aiba ansa de a se restabili. In plus, transmiterea rapida a aceluiai semnal ar putea duce la invocari recursive ale gestionarului. BSD a imbunatait aceasta situaie, dar, din pacate, a schimbat i semantica interfeei signal() existente. Pe BSD, atunci cand este invocat un gestionar de semnal, dispoziia semnalului nu este restabilita, iar alte instane ale semnalului sunt blocate in timp ce gestionarul este in curs de execuie. In plus, anumite apeluri de sistem cu blocare sunt repornite automat daca sunt intrerupte de un gestionar de semnal (a se vedea signal(7)). Semantica BSD este echivalenta cu apelarea sigaction(2) cu urmatoarele fanioane: sa.sa_flags = SA_RESTART; Situaia in Linux este urmatoarea: o Apelul de sistem signal() al nucleului asigura semantica System V. o In mod implicit, in glibc 2 i versiunile ulterioare, funcia de invaluire signal() nu invoca apelul de sistem al nucleului. In schimb, aceasta apeleaza sigaction(2) folosind fanioane care furnizeaza semantica BSD. Acest comportament implicit este furnizat atata timp cat este definita o macro de testare a funciei corespunzatoare: _BSD_SOURCE pe glibc 2.19 i versiunile anterioare sau _DEFAULT_SOURCE in glibc 2.19 i versiunile ulterioare; (in mod implicit, aceste macro sunt definite; consultai feature_test_macros(7) pentru detalii). Daca o astfel de macro de testare a caracteristicilor nu este definita, atunci signal() ofera semantica System V. NOTE Efectele lui signal() intr-un proces cu mai multe fire de execuie sunt nespecificate. In conformitate cu POSIX, comportamentul unui proces este nedefinit dupa ce acesta ignora un semnal SIGFPE, SIGILL sau SIGSEGV care nu a fost generat de kill(2) sau raise(3). Divizarea unui numar intreg cu zero are un rezultat nedefinit. Pe unele arhitecturi, aceasta va genera un semnal SIGFPE; (de asemenea, imparirea celui mai negativ numar intreg cu -1 poate genera SIGFPE). Ignorarea acestui semnal ar putea duce la o bucla fara sfarit. A se vedea sigaction(2) pentru detalii despre ce se intampla atunci cand dispoziia SIGCHLD este stabilita la SIG_IGN. A se vedea signal-safety(7) pentru o lista a funciilor async-signal-safe care pot fi apelate in sigurana din interiorul unui gestionar de semnal. CONSULTAI I kill(1), alarm(2), kill(2), pause(2), sigaction(2), signalfd(2), sigpending(2), sigprocmask(2), sigsuspend(2), bsd_signal(3), killpg(3), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), sysv_signal(3), signal(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 signal(2)