bionic (2) getcontext.2.gz

Provided by: manpages-es_1.55-10_all bug

NOMBRE

       getcontext, setcontext - consulta o establece el contexto de usuario

SINOPSIS

       #include <ucontext.h>

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

DESCRIPCIÓN

       En  un  entorno  del  tipo  SysV,  se  encuentran  los  dos  tipos  mcontext_t  y ucontext_t definidos en
       <ucontext.h> y las  cuatro  funciones  getcontext(),  setcontext(),  makecontext()  y  swapcontext()  que
       permiten  el  intercambio del contexto del nivel de usuario entre múltiples hilos de control dentro de un
       proceso.

       El tipo mcontext_t es dependiente de la máquina y opaco.  El tipo ucontext_t es una estructura que  tiene
       al menos los campos siguientes:
              typedef struct ucontext {
                   struct ucontext *uc_link;
                   sigset_t uc_sigmask;
                   stack_t uc_stack;
                   mcontext_t uc_mcontext;
                   ...
              } ucontext_t;
       de  los  cuales  sigset_t  y  stack_t están definidos en <signal.h>.  uc_link apunta al contexto que será
       reanudado cuando termine el contexto actual (en el caso de que el contexto actual haya sido creado usando
       makecontext()),  uc_sigmask es el conjunto de señales bloqueadas en este contexto (véase sigprocmask(2)),
       uc_stack es la pila usada por este contexto (véase sigaltstack(2)), y uc_mcontext  es  la  representación
       del  contexto  guardado  específica  de  la máquina, que incluye los registros de la máquina para el hilo
       invocador.

       La función getcontext() inicializa la estructura apuntada por ucp al contexto activo actualmente.

       La función setcontext() restablece el contexto de usuario apuntado por ucp. Si la llamada tiene éxito  no
       regresa.  El contexto debería haber sido obtenido mediante una llamada a getcontext(), o makecontext(), o
       pasada como tercer argumento al manejador de señales.

       Si el contexto se obtuvo mediante una llamada a getcontext(), la ejecución del programa continúa como  si
       esta llamada simplemente regresara.

       Si  el contexto fue obtenido mediante una llamada a makecontext(), la ejecución del programa continua por
       la llamada a la función func especificada como segundo argumento en la llamada a  makecontext().   Cuando
       la función func regresa, se continua con el miembro uc_link de la estructura ucp especificada como primer
       argumento en la llamada a makecontext().  Cuando este miembro es NULL, el hilo termina.

       Cuando el contexto se obtiene mediante una llamada a un manejador de señales,  se  solía  decir  que  "la
       ejecución  del  programa  continua con la instrucción de programa siguiente a la instrucción interrumpida
       por la señal". Sin embargo, esta sentencia fue eliminada en SUSv2, y ahora se establece que "el resultado
       es indefinido".

VALOR DEVUELTO

       Cuando  tiene  éxito,getcontext() devuelve 0 y setcontext() no regresa. En caso de error, ambas devuelven
       -1 y modifican errno con el valor apropiado.

ERRORES

       No se definen errores.

OBSERVACIONES

       La primera manifestación de este mecanismo fue el mecanismo setjmp()/longjmp(). Puesto que no  define  el
       manejo  del  contexto  de  señales,  el  siguiente paso fue el par sigsetjmp()/siglongjmp().  El presente
       mecanismo proporciona mucho más control. Por otra parte, no hay un método  sencillo  de  detectar  si  un
       regreso  de getcontext() es de la primera llamada o via una llamada a setcontext().  El usuario tiene que
       inventar su propio mecanismo de `contabilidad' y no se servirá una variable de tipo registro ya  que  los
       registros se restauran.

       Cuando  ocurre una señal, el contexto de usuario actual se guarda y el núcleo crea un nuevo contexto para
       el manejador de señales.  No deje  al  manejador  usar  longjmp()  -  es  indefinido  que  ocurriría  con
       contextos. Use siglongjmp() o setcontext() en su lugar.

CONFORME A

       SUSv2

VÉASE TAMBIÉN

       sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3), sigsetjmp(3), makecontext(3)