.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2001 Andries Brouwer (aeb@cwi.nl) .\" and Copyright (C) 2006 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" 2006-08-02, mtk, Added example program .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH makecontext 3 "13 decembrie 2024" "Pagini de manual de Linux 6.12" .SH NUME makecontext, swapcontext \- manipulează contextul utilizatorului .SH BIBLIOTECA Biblioteca C standard (\fIlibc\fP, \fI\-lc\fP) .SH SINOPSIS .nf \fB#include \fP .P \fBvoid makecontext(ucontext_t *\fP\fIucp\fP\fB, typeof(void (int \fP\fIarg0\fP\fB, ...)) *\fP\fIfunc\fP\fB,\fP \fB int \fP\fIargc\fP\fB, ...);\fP \fBint swapcontext(ucontext_t *restrict \fP\fIoucp\fP\fB,\fP \fB const ucontext_t *restrict \fP\fIucp\fP\fB);\fP .fi .SH DESCRIERE Într\-un mediu de tip System V, există tipul \fIucontext_t\fP (definit în \fI\fP și descris în \fBgetcontext\fP(3)) și cele patru funcții \fBgetcontext\fP(3), \fBsetcontext\fP(3), \fBmakecontext\fP() și \fBswapcontext\fP() care permit comutarea contextului la nivel de utilizator între mai multe fire de control în cadrul unui proces. .P Funcția \fBmakecontext\fP() modifică contextul indicat de \fIucp\fP (care a fost obținut în urma unui apel la \fBgetcontext\fP(3)). Înainte de a invoca \fBmakecontext\fP(), apelantul trebuie să aloce o nouă stivă pentru acest context și să îi atribuie adresa lui \fIucp\->uc_stack\fP, precum și să definească un context succesor și să îi atribuie adresa lui \fIucp\->uc_link\fP. .P Atunci când acest context este activat ulterior (utilizând \fBsetcontext\fP(3) sau \fBswapcontext\fP()), funcția \fIfunc\fP este apelată și i se transmite seria de argumente întregi (\fIint\fP) care urmează după \fIargc\fP; apelantul trebuie să specifice numărul acestor argumente în \fIargc\fP. Atunci când această funcție returnează, contextul succesor este activat. Dacă indicatorul contextului succesor este NULL, firul de execuție iese. .P Funcția \fBswapcontext\fP() salvează contextul curent în structura indicată de \fIoucp\fP, iar apoi activează contextul indicat de \fIucp\fP. .SH "VALOAREA RETURNATĂ" Atunci când reușește, \fBswapcontext\fP() nu returnează. (Dar am putea reveni mai târziu, în cazul în care \fIoucp\fP este activat, caz în care se pare că \fBswapcontext\fP() returnează 0.) În caz de eroare, \fBswapcontext\fP() returnează \-1 și configurează \fIerrno\fP pentru a indica eroarea. .SH ERORI\-IEȘIRE .TP \fBENOMEM\fP Spațiu rămas în stivă insuficient. .SH ATRIBUTE Pentru o explicație a termenilor folosiți în această secțiune, a se vedea \fBattributes\fP(7). .TS allbox; lb lb lbx l l l. Interfață Atribut Valoare T{ .na .nh \fBmakecontext\fP() T} Siguranța firelor T{ .na .nh MT\-Safe race:ucp T} T{ .na .nh \fBswapcontext\fP() T} Siguranța firelor T{ .na .nh MT\-Safe race:oucp race:ucp T} .TE .SH STANDARDE Niciunul. .SH ISTORIC glibc 2.1. SUSv2, POSIX.1\-2001. Eliminată în POSIX.1\-2008, citând probleme de portabilitate și recomandând ca aplicațiile să fie rescrise pentru a utiliza în schimb fire POSIX. .SH NOTE Interpretarea \fIucp\->uc_stack\fP este la fel ca în \fBsigaltstack\fP(2), și anume, această structură conține începutul și lungimea unei zone de memorie care urmează să fie utilizată ca stivă, indiferent de direcția de creștere a stivei. Astfel, nu este necesar ca programul utilizatorului să se preocupe de această direcție. .P Pe arhitecturile în care tipurile \fIint\fP și indicatorul sunt de aceeași dimensiune (de exemplu, x86\-32, unde ambele tipuri sunt de 32 de biți), este posibil să puteți scăpa pasând indicatorii ca argumente la \fBmakecontext\fP() după \fIargc\fP. Cu toate acestea, acest lucru nu este garantat a fi portabil, nu este definit în conformitate cu standardele și nu va funcționa pe arhitecturile în care indicatorii sunt mai mari decât \fIint\fP\-urile. Cu toate acestea, începând cu glibc 2.8, glibc face unele modificări la \fBmakecontext\fP(), pentru a permite acest lucru pe unele arhitecturi pe 64 de biți (de exemplu, x86\-64). .SH EXEMPLE Programul de exemplu de mai jos demonstrează utilizarea \fBgetcontext\fP(3), \fBmakecontext\fP() și \fBswapcontext\fP(). Rularea programului produce următoarea ieșire: .P .in +4n .EX $\fB ./a.out\fP main: swapcontext(&uctx_main, &uctx_func2) func2: inițiată func2: swapcontext(&uctx_func2, &uctx_func1) func1: inițiată func1: swapcontext(&uctx_func1, &uctx_func2) func2: returnând func1: returnând main: se iese .EE .in .SS "Sursa programului" .\" SRC BEGIN (makecontext.c) \& .EX #include #include #include \& static ucontext_t uctx_main, uctx_func1, uctx_func2; \& #define handle_error(msg) \[rs] do { perror(msg); exit(EXIT_FAILURE); } while (0) \& static void func1(void) { printf("%s: inițiată\[rs]n", __func__); printf("%s: swapcontext(&uctx_func1, &uctx_func2)\[rs]n", __func__); if (swapcontext(&uctx_func1, &uctx_func2) == \-1) handle_error("swapcontext"); printf("%s: returnând\[rs]n", __func__); } \& static void func2(void) { printf("%s: inișiată\[rs]n", __func__); printf("%s: swapcontext(&uctx_func2, &uctx_func1)\[rs]n", __func__); if (swapcontext(&uctx_func2, &uctx_func1) == \-1) handle_error("swapcontext"); printf("%s: returnând\[rs]n", __func__); } \& int main(int argc, char *argv[]) { char func1_stack[16384]; char func2_stack[16384]; \& if (getcontext(&uctx_func1) == \-1) handle_error("getcontext"); uctx_func1.uc_stack.ss_sp = func1_stack; uctx_func1.uc_stack.ss_size = sizeof(func1_stack); uctx_func1.uc_link = &uctx_main; makecontext(&uctx_func1, func1, 0); \& if (getcontext(&uctx_func2) == \-1) handle_error("getcontext"); uctx_func2.uc_stack.ss_sp = func2_stack; uctx_func2.uc_stack.ss_size = sizeof(func2_stack); /* Contextul succesor este f1(), cu excepția cazului în care argc > 1 */ uctx_func2.uc_link = (argc > 1) ? NULL : &uctx_func1; makecontext(&uctx_func2, func2, 0); \& printf("%s: swapcontext(&uctx_main, &uctx_func2)\[rs]n", __func__); if (swapcontext(&uctx_main, &uctx_func2) == \-1) handle_error("swapcontext"); \& printf("%s: se iese\[rs]n", __func__); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "CONSULTAȚI ȘI" \fBsigaction\fP(2), \fBsigaltstack\fP(2), \fBsigprocmask\fP(2), \fBgetcontext\fP(3), \fBsigsetjmp\fP(3) .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 .