Provided by: manpages-ro-dev_4.27.0-1_all bug

NUME

       makecontext, swapcontext - manipulează contextul utilizatorului

BIBLIOTECA

       Biblioteca C standard (libc, -lc)

SINOPSIS

       #include <ucontext.h>

       void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
       int swapcontext(ucontext_t *restrict oucp,
                       const ucontext_t *restrict ucp);

DESCRIERE

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

       Funcția makecontext() modifică contextul indicat de ucp (care  a  fost  obținut  în  urma  unui  apel  la
       getcontext(3)).   Înainte de a invoca makecontext(), apelantul trebuie să aloce o nouă stivă pentru acest
       context și să îi atribuie adresa lui ucp->uc_stack, precum și să definească un context succesor și să  îi
       atribuie adresa lui ucp->uc_link.

       Atunci când acest context este activat ulterior (utilizând setcontext(3) sau swapcontext()), funcția func
       este apelată și i se transmite seria de argumente întregi (int) care urmează după argc; apelantul trebuie
       să  specifice  numărul  acestor  argumente  în  argc.   Atunci când această funcție returnează, contextul
       succesor este activat.  Dacă indicatorul contextului succesor este NULL, firul de execuție iese.

       Funcția swapcontext() salvează contextul curent  în  structura  indicată  de  oucp,  iar  apoi  activează
       contextul indicat de ucp.

VALOAREA RETURNATĂ

       Atunci când reușește, swapcontext() nu returnează. (Dar am putea reveni mai târziu, în cazul în care oucp
       este  activat,  caz  în  care  se  pare  că  swapcontext() returnează 0.) În caz de eroare, swapcontext()
       returnează -1 și configurează errno pentru a indica eroarea.

ERORI-IEȘIRE

       ENOMEM Spațiu rămas în stivă insuficient.

ATRIBUTE

       Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
       ┌───────────────┬───────────────────┬───────────────────────────────────────────────────────────────────┐
       │ InterfațăAtributValoare                                                           │
       ├───────────────┼───────────────────┼───────────────────────────────────────────────────────────────────┤
       │ makecontext() │ Siguranța firelor │ MT-Safe race:ucp                                                  │
       ├───────────────┼───────────────────┼───────────────────────────────────────────────────────────────────┤
       │ swapcontext() │ Siguranța firelor │ MT-Safe race:oucp race:ucp                                        │
       └───────────────┴───────────────────┴───────────────────────────────────────────────────────────────────┘

STANDARDE

       Niciunul.

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.

NOTE

       Interpretarea  ucp->uc_stack  este  la  fel  ca  în  sigaltstack(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.

       Pe arhitecturile în care tipurile int ș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
       makecontext() după argc. 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
       int-urile.  Cu toate acestea, începând cu glibc 2.8, glibc face unele modificări la makecontext(), pentru
       a permite acest lucru pe unele arhitecturi pe 64 de biți (de exemplu, x86-64).

EXEMPLE

       Programul  de  exemplu  de mai jos demonstrează utilizarea getcontext(3), makecontext() și swapcontext().
       Rularea programului produce următoarea ieșire:

           $ ./a.out
           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

   Sursa programului

       #include <stdio.h>
       #include <stdlib.h>
       #include <ucontext.h>

       static ucontext_t uctx_main, uctx_func1, uctx_func2;

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       static void
       func1(void)
       {
           printf("%s: inițiată\n", __func__);
           printf("%s: swapcontext(&uctx_func1, &uctx_func2)\n", __func__);
           if (swapcontext(&uctx_func1, &uctx_func2) == -1)
               handle_error("swapcontext");
           printf("%s: returnând\n", __func__);
       }

       static void
       func2(void)
       {
           printf("%s: inișiată\n", __func__);
           printf("%s: swapcontext(&uctx_func2, &uctx_func1)\n", __func__);
           if (swapcontext(&uctx_func2, &uctx_func1) == -1)
               handle_error("swapcontext");
           printf("%s: returnând\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)\n", __func__);
           if (swapcontext(&uctx_main, &uctx_func2) == -1)
               handle_error("swapcontext");

           printf("%s: se iese\n", __func__);
           exit(EXIT_SUCCESS);
       }

CONSULTAȚI ȘI

       sigaction(2), sigaltstack(2), sigprocmask(2), getcontext(3), sigsetjmp(3)

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 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.

Pagini de manual de Linux 6.9.1                   15 iunie 2024                                   makecontext(3)