Gestores de señales
La consecuencia de enviar una señal a un proceso, si éste no está
preparado para aceptar dicha señal, es la finalización de su
ejecución; en la terminología más habitual, se dice que el proceso
"muere". Si el proceso dispone de un gestor de
señales, el proceso responderá a la señal ejecutando la rutina
asignada por el programador a las señales. Esta rutina podrá ser
desarrollada por el propio programador, o bien será la asociada por
defecto a la señal.
El gestor de señales anuncia que el proceso está preparado para
aceptar cierto tipo de señales y proporciona la dirección de la
rutina de tratamiento de señales, en caso de ser ésta de rango
especial. Se dice entonces que el proceso está preparado para
capturar esas señales.
Se asigna una señal a su rutina mediante una llamada a una función
de Linux. Si se genera una señal de carácter relevante, por
ejemplo, la pulsación de la tecla Supr, se realiza una
llamada al gestor de señales y el proceso interrumpe su ejecución.
El gestor puede estar funcionando el tiempo que sea necesario, y
realizar o responder a cualquier llamada del sistema. En la
práctica, el tiempo de funcionamiento suele ser pequeño; cuando
finaliza, restaura el estado del proceso, que continúa su ejecución
en el punto en que había sido interrumpido. Después de capturar una
señal se debe restablecer el gestor de señales mediante otra
llamada a la función que asigna la señal al procedimiento (si bien
algunas señales se restablecen por sí mismas).
Si otra señal del mismo tipo llega antes de que el gestor de
señales se haya restablecido, se ejecuta la acción por defecto de
la señal recibida, por lo general, la finalización del proceso. En
vez de proporcionar una función especial para capturar la señal, es
posible, como ya se ha dicho, ignorar la señal o restaurar la
acción por defecto mientras ésta se está gestionando.
Un problema habitual en el uso de gestores de señales es que la
rutina de tratamiento de la señal no conozca el estado del programa
cuando aparece la señal. El programa puede estar solicitando
memoria mediante malloc, liberándola mediante free, realizando una
llamada a una función que modifique el valor de una variable
estática o de una variable global externa, o esperando la
conclusión de un proceso hijo mediante wait. En estos casos,
el programador debe poner especial cuidado en la rutina de
tratamiento: por ejemplo, si se va a modificar una variable global
dentro del procedimiento de atención a la señal (bien directamente,
bien porque se llame a una función que lo modifique), se debe
guardar en una variable temporal el valor original y, al finalizar
la rutina, restaurar dicho valor.
Un ejemplo clásico de esta situación aparece al gestionar la señal
SIGCHLD, ya que por regla general la rutina de atención
utilizará alguna de las funciones wait, y esta llamada
producirá una modificación de la variable externa errno, que
se encuentra definida en <errno.h>. Cuando se trabaja
con procesos hijo, el gestor de señales puede interferir en el uso
de la función wait, porque cuando el proceso padre está
esperando la terminación del proceso hijo, si el usuario envía una
señal a ambos procesos, la gestión de ésta saca al proceso padre de
su estado de espera. Es decir, mientras el padre espera, las
señales deben ser gestionadas en el proceso hijo; por tanto, deben
activarse los gestores de señales en el padre para que las
ignore.
Hay 1 opinión. Opina sobre este curso.
| Cursos | Valoración | Alumnos | Vídeo | |
|---|---|---|---|---|
|
Técnicas para el desarrollo de computación móvil (orientado a PDA) Uno de los nuevos paradigmas en el desarrollo de proyectos informáticos es la computación móvil (computación Ubicua). Aquí se verá todo lo que involucra la creación de un... [31/03/06] |
|
1.369 | ||
|
Instalación de un Servidor de Correo en Linux Linux es un sistema operativo libre, con lo que no se tiene que pagar por ningún tipo de licencia. También se puede conseguir el código fuente y poderlo modificar libreme... [16/06/04] |
|
13.740 | ||
|
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.578 | ||
Publicar en
del.icio.us
digg
meneame