En Linux, ¿qué sucede cuando un programa (que posiblemente tiene varios subprocesos) recibe una señal, como SIGTERM o SIGHUP?
¿Qué hilo intercepta la señal? ¿Pueden varios subprocesos obtener la misma señal? ¿Existe un hilo especial dedicado enteramente al manejo de señales? Si no es así, ¿qué sucede dentro del hilo que debe manejar la señal? ¿Cómo se reanuda la ejecución después de que finaliza la rutina del controlador de señales?
pthreads(7)
describe que POSIX.1 requiere que todos los subprocesos de un proceso compartan atributos, incluidos:POSIX.1 también requiere que algunos atributos sean distintos para cada hilo, incluidos:
máscara de señal (
pthread_sigmask(3)
)pila de señal alternativa (
sigaltstack(2)
)La
complete_signal
rutina del kernel de Linux tiene el siguiente bloque de código; los comentarios son bastante útiles:Por lo tanto, se ve que usted está a cargo de donde se entregan las señales:
Si su proceso ha establecido la disposición de una señal en
SIG_IGN
oSIG_DFL
, entonces la señal se ignora (o de forma predeterminada: kill, core o ignore) para todos los subprocesos.Si su proceso ha establecido la disposición de una señal a una rutina de manejo específica, entonces puede controlar qué hilo recibirá las señales manipulando máscaras de señal de hilo específico usando
pthread_sigmask(3)
. Puede nominar un hilo para gestionarlos todos, o crear un hilo por señal, o cualquier combinación de estas opciones para señales específicas, o puede confiar en el comportamiento predeterminado actual del kernel de Linux de entregar la señal al hilo principal.Algunas señales, sin embargo, son especiales según la
signal(7)
página del manual:fuente