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

GNU                                             21 Diciembre 2020                                 MAKECONTEXT(3)