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)