jmp_buf
Un tipo
de arreglo adecuado para contener la información necesaria
para restaurar un entorno llamador.
int
setjmp(jmp_buf env);
Guarda su entorno llamador en el argumento jmp_bufpara uso posterior
en la función longjmp.
Si el regreso es debido a una invocación directa, la macro
setjmp devuelve el valor cero. Si el regreso es debido a una llamada
de la función longjmp , la macro setjmp devuelve un valor
no cero.Una invocación a la macro setjmp debe de aparecer
sólo en alguno de los siguientes contextos:
* en la totalidad de la expresión de control de un enunciado
de selección o de iteración.
*
Un operando de un operador relacional o de igualdad siendo el otro
operando una expresión constante entera, con la expresión
resultante siendo la expresión de control total de un enunciado
de selección o de iteración;
*
el operando del operador unario ! con la expresión resultante
siendo la expresión de control total de un enunciado de selección
o de iteración; o bien
*
la expresión total de un enunciado de expresión.
void longjmp(jmp_buf env, int val);
Devuelve el entorno guardado por la invocación más
reciente de la macro setjmp en la misma invocación del programa,
con el argumento correspondiente jmp_buf. Si dicha invocación
no ha ocurrido o si en el ínterin la función que contiene
la invocación de la macro setjmp ha terminado su ejecución,
el comportamiento queda indefinido.
Todos los objetos accesibles tienen valores correspondientes al
momento en que fue llamado longjmp, excepto que los valores de objeto
de persistencia automática, que son locales a la función
que contiene la invocación de la macro setjmp corresponmdiente
que no son del tipo volátil y que han sido modificados entre
la invocación setjmp y la invocación longjmp, quedan
indeterminados.
Como pasa por alto los mecanismos usuales de llamada de función
y de regreso, longjmp ejecutará de forma correcta en el contexto
de interrupciones, señales y cualquiera de sus funciones
asociadas. Sin embargo , si la funcuión longjmp es invocada
a partir de un manejador de señales anidado ( esto es, desde
una función invocada como resultado de una señal iniciada
durante el manejo de otra señal), el comportamiento queda
indefinido.
Despues de que longjmp se haya completado, la ejecución del
programa continuará como si la invocación correspondiente
de la macro setjmp hubiera devuelto el valor especificado por val.
La función longjmp no puede hacer que la macro setjmp devuelva
el valor 0; si val es 0, la macro setjmp devuelve el valor 1.
|