GETCONTEXT(2) | Manual del Programador de Linux | GETCONTEXT(2) |
getcontext, setcontext - consulta o establece el contexto de usuario
#include <ucontext.h>
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
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;
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".
Cuando tiene éxito,getcontext() devuelve 0 y setcontext() no regresa. En caso de error, ambas devuelven -1 y modifican errno con el valor apropiado.
No se definen errores.
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.
SUSv2
sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3), sigsetjmp(3), makecontext(3)
15 noviembre 2001 | Linux 2.4 |