getcontext, setcontext - consulta o establece el contexto de usuario
Biblioteca Estándar C (
libc,
-lc)
#include <ucontext.h>
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
En un entorno del tipo System V, 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_t {
struct ucontext_t *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(3)),
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.
The function
setcontext() restores the user context pointed to by
ucp. A successful call does not return. The context should have been
obtained by a call of
getcontext(), or
makecontext(3), or
received as the third argument to a signal handler (see the discussion of the
SA_SIGINFO flag in
sigaction(2)).
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(3), la
ejecución del programa continua por la llamada a la función
func especificada como segundo argumento en la llamada a
makecontext(3). 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(3).
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.
Para obtener una explicación de los términos usados en esta
sección, véase
attributes(7).
Interfaz |
Atributo |
Valor |
getcontext(), setcontext() |
Seguridad del hilo |
MT-Safe race:ucp |
SUSv2, POSIX.1-2001. POSIX.1-2008 removes the specification of
getcontext(), citing portability issues, and recommending that
applications be rewritten to use POSIX threads instead.
La primera manifestación de este mecanismo fue el mecanismo
setjmp(3)/
longjmp(3). Puesto que no define el manejo del
contexto de señales, el siguiente paso fue el par
sigsetjmp(3)/
siglongjmp(3). 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(3) - es indefinido que ocurriría
con contextos. Use
siglongjmp(3) o
setcontext() en su lugar.
sigaction(2),
sigaltstack(2),
sigprocmask(2),
longjmp(3),
makecontext(3),
sigsetjmp(3),
signal(7)
La traducción al español de esta página del manual fue
creada por Miguel Pérez Ibars <
[email protected]> y Marcos
Fouces <
[email protected]>
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
[email protected]