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'ON

       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 multiples  hilos
       de control dentro de un proceso.

       El  tipo  mcontext_t  es  dependiente  de  la maquina 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  estan  definidos  en  <signal.h>.
       uc_link  apunta  al  contexto  que  sera  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 senales bloqueadas
       en este contexto (vease sigprocmask(2)), uc_stack es la pila usada  por
       este   contexto   (vease   sigaltstack(2)),   y   uc_mcontext   es   la
       representacion del contexto guardado  especifica  de  la  maquina,  que
       incluye los registros de la maquina para el hilo invocador.

       La  funcion  getcontext()  inicializa la estructura apuntada por ucp al
       contexto activo actualmente.

       La funcion setcontext() restablece el contexto de usuario apuntado  por
       ucp.  Si  la llamada tiene exito no regresa.  El contexto deberia haber
       sido obtenido mediante una llamada a getcontext(), o  makecontext(),  o
       pasada como tercer argumento al manejador de senales.

       Si  el  contexto  se  obtuvo  mediante  una  llamada a getcontext(), la
       ejecucion del  programa  continua  como  si  esta  llamada  simplemente
       regresara.

       Si  el  contexto  fue obtenido mediante una llamada a makecontext(), la
       ejecucion del programa continua  por  la  llamada  a  la  funcion  func
       especificada  como  segundo  argumento  en  la llamada a makecontext().
       Cuando la funcion 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
       senales,  se solia decir que "la ejecucion del programa continua con la
       instruccion de programa siguiente a la instruccion interrumpida por  la
       senal".  Sin embargo, esta sentencia fue eliminada en SUSv2, y ahora se
       establece que "el resultado es indefinido".

VALOR DEVUELTO

       Cuando tiene exito,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  manifestacion  de  este   mecanismo   fue   el   mecanismo
       setjmp()/longjmp().  Puesto  que  no  define  el manejo del contexto de
       senales, el siguiente paso fue  el  par  sigsetjmp()/siglongjmp().   El
       presente  mecanismo  proporciona  mucho mas control. Por otra parte, no
       hay un metodo 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 servira  una
       variable de tipo registro ya que los registros se restauran.

       Cuando  ocurre  una senal, el contexto de usuario actual se guarda y el
       nucleo crea un nuevo contexto para el manejador de senales.  No deje al
       manejador  usar  longjmp() - es indefinido que ocurriria con contextos.
       Use siglongjmp() o setcontext() en su lugar.

CONFORME A

       SUSv2

V'EASE TAMBI'EN

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