
Desde APUE
Un proceso tiene tres opciones para tratar una señal.
Ignora la señal. Esta opción no se recomienda para señales que denotan una excepción de hardware, como dividir por cero o hacer referencia a memoria fuera del espacio de direcciones del proceso, ya que los resultados no están definidos.
Deje que se produzca la acción predeterminada. Para una condición de división por cero, el valor predeterminado es finalizar el proceso.
Proporcione una función que se llame cuando se produzca la señal (esto se llama "captar" la señal). Al proporcionar una función propia, sabremos cuándo se produce la señal y podremos manejarla como queramos.
Creo que sólo hay dos opciones: las dos últimas enumeradas anteriormente, y ambas pueden "ignorar la señal" (la primera opción enumerada anteriormente).
¿Mi comprensión es correcta o hay realmente tres opciones que no se superponen como en la cita? ¿Por qué?
El libro menciona que la acción predeterminada de alguna señal es ignorarla. ¿Significa que la acción de la señal es SIG_IGN o SIG_DFL o una función vacía? Por ejemplo:
Elpor defectoLa acción para SIGCHLD debe serignorado. Describimos estas opciones en el Capítulo 10.
SIGNCONT: El por defecto acción es continuar un proceso detenido, pero ignorarla señal si el proceso no se detuvo.
Gracias.
Respuesta1
Por supuesto, se puede escribir un controlador de señales que no haga nada y, por lo tanto, ignorar efectivamente la señal, pero la primera opción es ignorar específicamente la señal utilizando el SIG_IGN
argumento de la signal()
llamada al sistema.
Entonces en términos de código, asumiendo la SIGINT
señal, estas son las tres opciones:
signal(SIGINT, SIG_IGN);
ignorar- No llamar a la
signal()
función, o llamarlasignal(SIGINT, SIG_DFL);
y así permitir que ocurra la acción predeterminada, es decir, terminar el proceso. signal(SIGINT, termination_handler);
, dondetermination_handler()
es una función que se llama la primera vez que ocurre la señal.
Fuente:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html
Para el caso específico de señales donde la acción predeterminada es ignorar la señal, las dos primeras opciones ( SIG_IGN
y SIG_DFL
) son idénticas. La creación de una función de controlador vacía probablemente no tendrá un efecto visible, aparte de una (pequeña) sobrecarga.
NOTA: Se signal()
utiliza en esta respuesta por simplicidad, pero en el código nuevo sigaction()
se recomienda por razones de portabilidad.