¿Cómo podemos configurar una trampa de señal para que sea SIG_IGN y SIG_DFL en bash?

¿Cómo podemos configurar una trampa de señal para que sea SIG_IGN y SIG_DFL en bash?

Dehttps://unix.stackexchange.com/a/447032/674

Entonces en términos de código, asumiendo la SIGINTseñal, estas son las tres opciones:

  • signal(SIGINT, SIG_IGN);ignorar
  • No llamar a la signal()función, o llamarla signal(SIGINT, SIG_DFL);y así permitir que ocurra la acción predeterminada, es decir, terminar el proceso.
  • signal(SIGINT, termination_handler);, donde termination_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_IGNen 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_DFLen 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 INTseñ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_IGNla primera llamada rt_sigaction()y sa_handler=SIG_DFLla segunda, parece que realmente trap "" INTse bashignora la señal y trap - INTse restablece el controlador predeterminado.

información relacionada