getcontext(3)

NUME
getcontext, setcontext - obține sau stabilește contextul utilizatorului

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <ucontext.h>

int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);

DESCRIERE
Într-un mediu de tip System V, există cele două tipuri mcontext_t și ucontext_t definite în <ucontext.h> și cele patru funcții getcontext(), setcontext(), makecontext(3) și swapcontext(3) care permit comutarea contextului la nivel de utilizator între mai multe fire de control în cadrul unui proces.

Tipul mcontext_t depinde de mașină și este opac. Tipul ucontext_t este o structură care are cel puțin următoarele câmpuri:

    typedef struct ucontext_t {
        struct ucontext_t *uc_link;
        sigset_t          uc_sigmask;
        stack_t           uc_stack;
        mcontext_t        uc_mcontext;
        ...
    } ucontext_t;

cu sigset_t și stack_t definite în <signal.h>. Aici uc_link indică contextul care va fi reluat atunci când contextul curent se termină (în cazul în care contextul curent a fost creat folosind makecontext(3)), uc_sigmask este setul de semnale blocate în acest context (a se vedea sigprocmask(2)), uc_stack este stiva utilizată de acest context (a se vedea sigaltstack(2)), iar uc_mcontext este reprezentarea specifică mașinii a contextului salvat, care include registrele mașinii firului apelant.

Funcția getcontext() inițializează structura indicată de ucp în contextul activ curent.

Funcția setcontext() restabilește contextul utilizatorului indicat de ucp. Un apel reușit nu returnează. Contextul ar fi trebuit să fie obținut printr-un apel la getcontext() sau makecontext(3), sau primit ca al treilea argument al unui gestionar de semnal (a se vedea discuția despre fanionul SA_SIGINFO din sigaction(2)).

Dacă contextul a fost obținut printr-un apel la getcontext(), execuția programului continuă ca și cum acest apel tocmai a fost returnat.

În cazul în care contextul a fost obținut printr-un apel la makecontext(3), execuția programului continuă printr-un apel la funcția func specificată ca al doilea argument al apelului la makecontext(3). La întoarcerea funcției func, continuăm cu membrul uc_link al structurii ucp specificat ca prim argument al acelui apel la makecontext(3). Atunci când acest membru este NULL, firul de execuție iese.

Dacă contextul a fost obținut printr-un apel la un gestionar de semnal, atunci vechiul text standard spune că „execuția programului continuă cu instrucțiunea de program care urmează instrucțiunii întrerupte de semnal”. Cu toate acestea, această propoziție a fost eliminată în SUSv2, iar verdictul actual este „rezultatul este nespecificat”.

VALOAREA RETURNATĂ
În caz de succes, getcontext() returnează 0, iar setcontext() nu returnează. În caz de eroare, ambele returnează -1 și setează errno pentru a indica eroarea.

ERORI-IEȘIRE
Nu sunt definite.

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
getcontext(), setcontext() | Siguranța firelor | MT-Safe race:ucp

STANDARDE
Niciunul.

ISTORIC
SUSv2, POSIX.1-2001.

POSIX.1-2008 elimină aceste funcții, invocând probleme de portabilitate și recomandând ca aplicațiile să fie rescrise pentru a utiliza în schimb fire POSIX.

NOTE
Cea mai veche întruchipare a acestui mecanism a fost mecanismul setjmp(3)/ longjmp(3). Deoarece acesta nu definește gestionarea contextului semnalului, următoarea etapă a fost perechea sigsetjmp(3)/ siglongjmp(3). Mecanismul actual oferă mult mai mult control. Pe de altă parte, nu există o modalitate ușoară de a detecta dacă o returnare de la getcontext() provine din primul apel sau prin intermediul unui apel setcontext(). Utilizatorul trebuie să inventeze propriul dispozitiv de evidență contabilă, iar o variabilă de registru nu este suficientă, deoarece registrele sunt restaurate.

Atunci când apare un semnal, contextul curent al utilizatorului este salvat și un nou context este creat de către nucleu pentru gestionarul de semnal. Nu părăsiți gestionarul folosind longjmp(3): nu este definit ce se întâmplă cu contextele. Utilizați în schimb siglongjmp(3) sau setcontext().

CONSULTAȚI ȘI
sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3), makecontext(3), sigsetjmp(3), signal(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.