Estoy ejecutando una aplicación multiproceso escrita en C en Linux.
Para detener la ejecución, envío SIGINT y, desde el controlador de señales, llamo a varias rutinas de limpieza y, finalmente, llamo a exit(0) .
¿Siguen ejecutándose los otros subprocesos o pueden ejecutarse (cambio de contexto) mientras el controlador ejecuta las rutinas de limpieza?
El manejo de una señal no provoca la suspensión de otros subprocesos durante la ejecución del controlador de señales. Además, generalmente no es seguro llamar a la mayoría de las funciones que necesitaría para la limpieza (¡incluida incluso exit !) Desde un controlador de señal a menos que pueda asegurarse de que no interrumpa una función no segura de señal asíncrona.
Lo que debe hacer es simplemente almacenar el hecho de que SIGINT se recibió de alguna manera segura para señales asíncronas y hacer que el programa actúe en esa condición como parte de su flujo normal de ejecución, fuera del controlador de señales. Luego, puede sincronizar adecuadamente con otros subprocesos (usando mutexes, variables de condición, etc.) para lograr un apagado adecuado y seguro. El método ideal es ni siquiera instalar un controlador de señales, sino bloquear todas las señales y tener un subproceso de manejo de señales dedicado que llame a sigwaitinfo en un bucle para aceptar señales.
Sí, se entrega una señal a un subproceso, elegido de una manera no especificada. Sin embargo, solo se consideran los subprocesos que no bloquean la señal; si todos los subprocesos bloquean la señal, permanece en cola hasta que un subproceso la desbloquea.
(Entonces, si hace que todos los subprocesos bloqueen la señal, puede usar la señal como un mecanismo de sincronización determinista entre procesos, por ejemplo, usando sigwait ).