Provided by: manpages-es-dev_4.13-4_all bug

NOMBRE

       makecontext, swapcontext - manipulan el contexto de usuario

SINOPSIS

       #include <ucontext.h>

       void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);

       int swapcontext(ucontext_t *oucp, const ucontext_t *ucp);

DESCRIPCIÓN

       In  a  System V-like environment, one has the type ucontext_t (defined in <ucontext.h> and
       described  in  getcontext(3))   and  the  four  functions  getcontext(3),   setcontext(3),
       makecontext(), and swapcontext()  that allow user-level context switching between multiple
       threads of control within a process.

       The makecontext()  function modifies the context pointed to by  ucp  (which  was  obtained
       from  a call to getcontext(3)).  Before invoking makecontext(), the caller must allocate a
       new stack for this context and assign its address to ucp->uc_stack, and define a successor
       context and assign its address to ucp->uc_link.

       When this context is later activated (using setcontext(3)  or swapcontext())  the function
       func is called, and passed the series of integer (int)  arguments that  follow  argc;  the
       caller  must  specify  the number of these arguments in argc.  When this function returns,
       the successor context is activated.  If the successor context pointer is NULL, the  thread
       exits.

       La  función  swapcontext()  salva el contexto actual en la estructura apuntada por oucp, y
       activa el contexto apuntado por ucp.

VALOR DEVUELTO

       When successful, swapcontext()  does not return.  (But we may return later, in  case  oucp
       is  activated,  in  which  case  it  looks  like  swapcontext()   returns  0.)   On error,
       swapcontext()  returns -1 and sets errno appropriately.

ERRORES

       ENOMEM No queda suficiente espacio en la pila.

VERSIONES

       makecontext()  and swapcontext()  are provided in glibc since version 2.1.

ATRIBUTOS

       Para obtener una explicación de los términos usados en esta sección, véase attributes(7).

       ┌──────────────┬────────────────────┬────────────────────────────┐
       │InterfazAtributoValor                      │
       ├──────────────┼────────────────────┼────────────────────────────┤
       │makecontext() │ Seguridad del hilo │ MT-Safe race:ucp           │
       ├──────────────┼────────────────────┼────────────────────────────┤
       │swapcontext() │ Seguridad del hilo │ MT-Safe race:oucp race:ucp │
       └──────────────┴────────────────────┴────────────────────────────┘

CONFORME A

       SUSv2, POSIX.1-2001.   POSIX.1-2008  removes  the  specifications  of  makecontext()   and
       swapcontext(),  citing portability issues, and recommending that applications be rewritten
       to use POSIX threads instead.

NOTAS

       La interpretación de ucp->uc_stack es como en sigaltstack(2),  a  saber,  esta  estructura
       contiene  el  comienzo y la longitud de un área de memoria a ser usada como pila, sea cual
       sea la dirección de crecimiento de la  pila.  Por  lo  tanto,  no  es  necesario  que  los
       programas de usuario se preocupen por esta dirección.

       On  architectures  where int and pointer types are the same size (e.g., x86-32, where both
       types are 32 bits), you may be able to get away with  passing  pointers  as  arguments  to
       makecontext()   following  argc.  However, doing this is not guaranteed to be portable, is
       undefined according to the standards, and won't work on architectures where  pointers  are
       larger  than  ints.   Nevertheless, starting with version 2.8, glibc makes some changes to
       makecontext(), to permit this on some 64-bit architectures (e.g., x86-64).

EJEMPLOS

       The example program below  demonstrates  the  use  of  getcontext(3),  makecontext(),  and
       swapcontext().  Running the program produces the following output:

           $ ./a.out
           main: swapcontext(&uctx_main, &uctx_func2)
           func2: started
           func2: swapcontext(&uctx_func2, &uctx_func1)
           func1: started
           func1: swapcontext(&uctx_func1, &uctx_func2)
           func2: returning
           func1: returning
           main: exiting

   Program source

       #include <ucontext.h>
       #include <stdio.h>
       #include <stdlib.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("func1: started\n");
           printf("func1: swapcontext(&uctx_func1, &uctx_func2)\n");
           if (swapcontext(&uctx_func1, &uctx_func2) == -1)
               handle_error("swapcontext");
           printf("func1: returning\n");
       }

       static void
       func2(void)
       {
           printf("func2: started\n");
           printf("func2: swapcontext(&uctx_func2, &uctx_func1)\n");
           if (swapcontext(&uctx_func2, &uctx_func1) == -1)
               handle_error("swapcontext");
           printf("func2: returning\n");
       }

       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);
           /* Successor context is f1(), unless argc > 1 */
           uctx_func2.uc_link = (argc > 1) ? NULL : &uctx_func1;
           makecontext(&uctx_func2, func2, 0);

           printf("main: swapcontext(&uctx_main, &uctx_func2)\n");
           if (swapcontext(&uctx_main, &uctx_func2) == -1)
               handle_error("swapcontext");

           printf("main: exiting\n");
           exit(EXIT_SUCCESS);
       }

VÉASE TAMBIÉN

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

COLOFÓN

       Esta  página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una
       descripción del proyecto, información sobre cómo informar errores y la última  versión  de
       esta página en https://www.kernel.org/doc/man-pages/.

TRADUCCIÓN

       La  traducción  al  español  de  esta  página del manual fue creada por Miguel Pérez Ibars
       <mpi79470@alu.um.es>

       Esta traducción es documentación libre; lea  la  GNU  General  Public  License  Version  3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  o posterior con respecto a las condiciones de
       copyright.  No existe NINGUNA RESPONSABILIDAD.

       Si encuentra algún error en la traducción de esta  página  del  manual,  envíe  un  correo
       electrónico a debian-l10n-spanish@lists.debian.org ⟨⟩.