La respuesta de @hvd es básicamente correcta. Para respaldar eso aún más, el init
proceso primero se enviará SIGTERM
a los procesos cuando esté apagando su computadora, luego, después de un retraso, se enviará SIGKILL
si aún no han salido. Los procesos no pueden manejar / ignorar SIGKILL
.
Sin embargo, para dar un poco más de detalle, la respuesta real es que no tiene forma de saber con certeza si el programa lo maneja. SIGTERM
es la señal más habitual para pedir cortésmente que un programa se cierre, pero todo el manejo de la señal depende de que el programa haga algo con la señal.
Para decirlo de otra manera, según las otras respuestas, si tuviera un programa escrito por @Jos o por @AlexGreg, presumiblemente estarían manejando SIGQUIT
pero posiblemente no SIGTERM
, y por SIGTERM
lo tanto el envío sería menos "suave" que SIGQUIT
.
He escrito un código para que puedas jugarlo tú mismo. Guarde lo siguiente como signal-test.c
, luego compile con
gcc -o signal-test signal-test.c
Luego puede ejecutarlo ./signal-test
y ver qué sucede cuando envía diferentes señales con killall -s <signal>
.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
Tal como está, el código maneja tanto SIGTERM como SIGQUIT con gracia. Puede intentar comentar las líneas signal(SIG...
(utilizando un //
al comienzo de la línea) para eliminar el controlador de señal, luego ejecutar y enviar las señales nuevamente. Debería poder ver estas diferentes salidas:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
dependiendo de si manejas las señales o no.
También podría intentar ignorar las señales:
signal(SIGTERM, SIG_IGN);
Si haces eso, el envío SIGTERM
no hará nada, tendrás que usarlo SIGKILL
para finalizar el proceso.
Más detalles en man 7 signal
. Tenga signal()
en cuenta que el uso de esta manera se considera no portátil, ¡aunque es mucho más fácil que la alternativa!
Otra nota al pie de página menor: sobre los killall
intentos de Solaris de matar todos los procesos. Todos ellos. Si lo ejecutas como root, te sorprenderás :)