sigreturn(2) System Calls Manual sigreturn(2)

sigreturn, rt_sigreturn, rt_sigreturn - returnează de la gestionarul de semnal și curăță cadrul stivei

Biblioteca C standard (libc, -lc)

int sigreturn(...);

Dacă nucleul Linux determină că un semnal deblocat este în așteptare pentru un semnal de proces, atunci, la următoarea tranziție înapoi la modul utilizator în acel proces (de ex. de exemplu, la revenirea de la un apel de sistem sau atunci când procesul este reprogramat pe CPU), acesta creează un nou cadru pe stiva din spațiul de utilizator în care salvează diferite elemente ale contextului procesului (cuvânt de stare al procesorului, registre, semnal mască și parametrii stivei de semnale).

De asemenea, nucleul face în așa fel încât, în timpul tranziției înapoi la modul utilizator, să fie apelat gestionarul de semnal și, la revenirea de la gestionarul de semnal, controlul să treacă la o bucată de cod din spațiul utilizatorului, numită în mod obișnuit „trambulina de semnal”. La rândul său, codul de trambulină de semnal apelează sigreturn().

Acest apel sigreturn() anulează tot ceea ce s-a făcut—modificarea măștii de semnal a procesului, comutarea stivei de semnale (a se vedea sigaltstack(2))——pentru a invoca gestionarul de semnal. Utilizând informațiile care au fost salvate anterior pe stiva din spațiul utilizatorului, sigreturn() restabilește masca de semnal a procesului, schimbă stivele și restabilește contextul procesului (fanioanele și registrele procesorului, inclusiv indicatorul de stivă și indicatorul de instrucțiuni), astfel încât procesul își reia execuția în punctul în care a fost întrerupt de semnal.

sigreturn() nu returnează niciodată.

Multe sisteme de tip UNIX au un apel de sistem sigreturn() sau aproape echivalent. Cu toate acestea, acest apel nu este specificat în POSIX, iar detaliile privind comportamentul său variază de la un sistem la altul.

Niciunul.

sigreturn() există doar pentru a permite implementarea gestionarilor de semnal. Nu ar trebui niciodată să fie apelat direct. (Într-adevăr, un simplu sigretreturn() din biblioteca GNU C returnează pur și simplu -1, cu errno configurată la ENOSYS). Detaliile privind argumentele (dacă există) transmise către sigretreturn() variază în funcție de arhitectură. (Pe unele arhitecturi, cum ar fi x86-64, sigretreturn() nu acceptă niciun argument, deoarece toate informațiile de care are nevoie sunt disponibile în cadrul stivei care a fost creată anterior de către nucleu pe stiva din spațiul utilizatorului).

Mai demult, sistemele UNIX plasau codul de trambulină de semnal pe stiva utilizatorului. În prezent, paginile din stiva utilizatorului sunt protejate astfel încât să nu permită executarea de cod. Astfel, pe sistemele Linux contemporane, în funcție de arhitectură, codul de trambulină de semnal se află fie în vdso(7), fie în biblioteca C. În acest din urmă caz, funcția de învăluire sigaction(2) a bibliotecii C informează nucleul cu privire la locația codului de trambulină prin plasarea adresei sale în câmpul sa_restorer al structurii sigaction și activează fanionul SA_RESTORER în câmpul sa_flags.

Informațiile salvate despre contextul procesului sunt plasate într-o structură ucontext_t (a se vedea <sys/ucontext.h>). Această structură este vizibilă în cadrul gestionarului de semnal ca al treilea argument al unui gestionar stabilit prin sigaction(2) cu fanionul SA_SIGINFO.

Pe alte sisteme UNIX, funcționarea trambulinei de semnal diferă puțin. În special, pe unele sisteme, la revenirea la modul utilizator, nucleul transmite controlul către trambulină (mai degrabă decât către gestionarul de semnal), iar codul trambulinei apelează gestionarul de semnal (și apoi apelează sigreturn() odată ce gestionarul returnează).

Apelul de sistem original din Linux a fost numit sigreturn(). Cu toate acestea, odată cu adăugarea semnalelor în timp real în Linux 2.2, a fost adăugat un nou apel de sistem, rt_sigreturn(), pentru a suporta un tip sigset_t extins. Biblioteca GNU C ne ascunde aceste detalii, utilizând în mod transparent rt_sigreturn() atunci când nucleul îl furnizează.

kill(2), restart_syscall(2), sigaltstack(2), signal(2), getcontext(3), signal(7), vdso(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