
Dehttps://unix.stackexchange.com/a/447032/674
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.
En bash, ¿cómo puedo configurar el controlador de una señal SIG_IGN
?
trap "" INT
establece un comando vacío ""
como manejador de señales. ¿Pero realmente configura el controlador SIG_IGN
?
Cuando bash ejecuta un comando externo, restablecerá las trampas de señales a los valores predeterminados y mantendrá las señales ignoradas aún ignoradas. Por lo tanto, es importante saber cómo configurar un controlador de señales para que esté SIG_IGN
en bash y si configurar un controlador de señales con el comando vacío ""
es lo mismo que configurarlo en SIG_IGN
.
Pregunta similar sobre cómo configurar una trampa de señal para estar SIG_DFL
en bash.
Gracias.
Respuesta1
De la documentación POSIX dela utilidad especial incorporadatrap
:
Si la acción es
-
, el shell restablecerá cada condición al valor predeterminado. Si la acción es nula (""
), el shell ignorará cada condición especificada si surge. De lo contrario, el shell leerá y ejecutará la acción del argumento cuando surja una de las condiciones correspondientes.
Esto significa que su secuencia de comandos, después de trap "" INT
, ignorará la INT
señal y que puede restablecer la trampa a los valores predeterminados con trap - INT
.
Respuesta2
Tomé este guión:
#!/bin/bash
trap "" INT
trap - INT
Y corrió:
$ strace bash script.sh 2>&1 | grep INT
Entre el resultado, veo:
read(3, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 80) = 35
read(255, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 35) = 35
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
Teniendo en cuenta sa_handler=SIG_IGN
la primera llamada rt_sigaction()
y sa_handler=SIG_DFL
la segunda, parece que realmente trap "" INT
se bash
ignora la señal y trap - INT
se restablece el controlador predeterminado.