Necesito ejecutar una limpieza antes de salir del servicio al finalizar (por Linux systemctl stop my-srv
Se me ocurrieron hasta ahora con 2 soluciones:
void signal_callback(int code) { _exit(0); } . . . void main.. { signal(SIGTERM, signal_callback) fgetc(stdin); // wait for signal } ¿En qué subproceso se llama la devolución de signal_callback ? ¿Será el mismo hilo que registró la devolución de llamada? Quiero decir, si llamo a signal en el hilo principal y luego llamo a exit en signal_callback , ¿la aplicación terminará correctamente?
¿En qué subproceso se llama la devolución de llamada_señal?
Depende de cómo envíes la señal.
raise , la devolución de llamada se llamará en el mismo hilo.pthread_kill , entonces la devolución de llamada de la señal se llamará en el subproceso cuya identificación se pasó a pthread_kill .kill , creo que es mejor citar documentación:POSIX.1 requiere que si un proceso se envía una señal a sí mismo, y el subproceso de envío no tiene la señal bloqueada, y ningún otro subproceso la tiene desbloqueada o la está esperando en sigwait(3), al menos una señal desbloqueada debe ser entregado al subproceso de envío antes de que kill() regrese.
Habrá diferencias si
si... llamo a exit en signal_callback, ¿la aplicación terminará correctamente?
No, exit no es una función segura asíncrona. No está bien llamarlo desde un controlador de señal.
Con respecto a la edición: _exit es asíncrono seguro, por lo que puede llamarlo. Pero no llamará a las funciones de limpieza registradas, ni se desenrollará la pila, por lo que no lo describiría como "elegante" como tal.
PS main debe devolver int .
Por defecto, las señales se envían al proceso ; no a ningún subproceso específico que pueda tener ese proceso. Si hay varios subprocesos, los estándares no especifican qué subproceso maneja la(s) señal(es).
Por supuesto, puede enmascarar las señales para que ciertos subprocesos no las reciban o que solo un subproceso específico maneje las señales. Consulte pthread_sigmask para Linux.
si llamo a signal en el hilo principal y luego llamo a exit en signal_callback, ¿la aplicación terminará correctamente?
Lo que significa "con gracia" depende de su programa. Si configura un controlador de señal como lo ha hecho, simplemente saldrá al recibir la señal. Si el proceso muere limpiamente depende de lo que estaba haciendo cuando recibió la señal, por ejemplo, si se necesita alguna acción de limpieza, si se deben liberar recursos (los que no se liberan automáticamente al salir), etc.