Al ser llamada, la función setjmp guarda en una variable
el entorno de pila. La definición de setjmp es:
include <setjmp.h>
int setjmp (jmp_buf env);
donde env es la variable donde se guarda el entorno de pila. El
tipo jmp_buf se define en <setjmp.h>. El valor
retornado es 0 la primera vez que se llama a la función.
Cuando se llama a la función longjmp, el programa salta a la
línea donde se encuentra setjmp. Su definición es:
include <setjmp.h>
void longjmp (jmp_buf env, int val);
donde env es la variable donde se guardó el entorno de pila con
setjmp, y val, el valor que retornará setjmp cuando el flujo de la
ejecución salte desde longjmp a setjmp. Es decir, con
una llamada a setjmp, el programador marca el punto al que
saltará el flujo de ejecución, cuando se ejecute longjmp.
Mientras se esté ejecutando el flujo normal del programa, setjmp
devolverá el valor 0, y cuando se salte hasta setjmp
haciendo uso de longjmp,el valor de retorno de la función
será el especificado en longjmp en la variable val. La
variable de entorno de pila sirve, en el flujo normal del programa,
para restaurar el proceso al estado en el que se encontraba la
última vez que se ejecutó setjmp.
El uso de estas dos funciones no está limitado a la gestión de
señales, pero es aquí donde su empleo es más frecuente. Mediante
setjmp se fija el punto del programa al que se desea volver después
de recibir una señal. La función que gestiona la señal utiliza
longjmp para permitir que, una vez gestionada la señal, el proceso
continúe en un punto prefijado por el programador mediante
setjmp.
Existe un problema cuando se llama a longjmp: la máscara de señales
que se restaura en el punto al que se salta definido por
setjmp es distinta de la máscara de señales que existía en
el momento en que setjmp fue invocada. Evidentemente, en la
variable de entorno se ha almacenado la información necesaria para
que el proceso se siga ejecutando desde ese punto, pero esa
variable de entorno no almacena la máscara definida para las
señales.
Cuando se captura una señal, la función que lo consigue comienza a
ejecutarse automáticamente en cuanto ésta llega. Como se ha visto,
al comienzo de la rutina, se desactiva la señal que se está
tratando, para evitar la ejecución de la acción por defecto, que
puede romper la propia ejecución. Para evitar responder a la señal
correspondiente, la rutina añade la señal a la máscara de señales
del proceso, lo que previene sobre apariciones de una señal
procedente de la interrupción del gestor de señales. Esta nueva
máscara es la que existe en el punto definido por setjmp, que no es
la misma que estaba definida cuando se llamó a la sentencia
setjmp. Para evitar este efecto indeseable se utilizan las
funciones:
include <setjmp.h>
int sigsetjmp (sigjmp_buf env, int savemask);
void siglongjmp (sigjmp_buf env, int val);
donde la única variación respecto a lo comentado es la variable
savemask, que, si tiene un valor no nulo, forzará a
sigsetjmp a salvar la máscara de señales para,
posteriormente, ser restaurada cuando el flujo del programa salte
hasta sigsetjmp mediante una llamada a siglongjmp.
El uso de estas funciones dota al desarrollo de programas de otras
funciones que los hacen más robustos frente a posibles errores en
la ejecución. El programa debe, en primer lugar, instalar la rutina
de tratamiento y, posteriormente, definir el punto en donde se va a
producir el salto.
Nota: Con este capítulo hemos llegado al final del curso.
Recuerda que este trabajo es un fragmento del libro "CEO -
Desarrollo de funciones en el sistema informático" del autor
J. M. Molina, F. Chamorro,publicado por la editorial
McGraw-Hill (ISBN: 84-481-4877-0).
Información de los programas con certificado
Hay 1 opinión. Opina sobre este curso.
| Cursos | Valoración | Alumnos | Vídeo | |
|---|---|---|---|---|
|
Bases de Datos en C# El curso incluye el código necesario para acceder a las bases de datos y realizar consultas de selección y de acción.... [05/04/07] |
|
5.017 | ||
|
SQL SQL (Structured Query Language) es un lenguaje de programación para acceder y manipular bases de datos. SQL surgió de un proyecto de IBM en el que investigaba e... [10/05/04] |
|
35.402 | ||
|
Creación de Paginas Web con Html HTML es el lenguaje básico y muy sencillo que nos permite la creación de Paginas Web. Este curso ha nacido con la intención de complementar los anteriores cursos de JavaS... [26/05/05] |
|
20.865 | ||
Publicar en
del.icio.us
digg
meneame