我们如何在bash中将信号陷阱设置为SIG_IGN和SIG_DFL?

我们如何在bash中将信号陷阱设置为SIG_IGN和SIG_DFL?

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

因此,就代码而言,假设SIGINT信号,有以下三个选项:

  • signal(SIGINT, SIG_IGN);忽略
  • 不调用该signal()函数,或者使用signal(SIGINT, SIG_DFL);and 调用它,从而让默认操作发生,即终止进程
  • signal(SIGINT, termination_handler);,其中termination_handler()是信号第一次出现时调用的函数。

在bash中,如何将信号的处理程序设置为SIG_IGN

trap "" INT

设置一个空命令""作为信号处理程序。但它真的将处理程序设置为 吗SIG_IGN

当 bash 执行外部命令时,它会将信号陷阱重置为默认值,并保持被忽略的信号仍然被忽略。因此了解如何SIG_IGN在 bash 中设置信号处理程序以及将信号处理程序设置为空命令是否""与设置为SIG_IGN.

SIG_DFL关于如何在 bash 中设置信号陷阱的类似问题。

谢谢。

答案1

来自 POSIX 文档特殊的内置实用程序trap:

如果 action 是-,shell 会将每个条件重置为默认值。如果 action 为 null ( ""),则 shell 将忽略出现的每个指定条件。否则,当相应条件之一出现时,参数操作应由 shell 读取并执行。

这意味着您的脚本 aftertrap "" INT将会忽略该INT信号,并且您可以使用 来将陷阱重置为默认值trap - INT

答案2

我拿了这个脚本:

#!/bin/bash
trap "" INT
trap - INT

并跑:

$ strace bash script.sh 2>&1 | grep INT

在输出中,我看到:

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

鉴于sa_handler=SIG_IGN第一次调用中的rt_sigaction()sa_handler=SIG_DFL第二次调用中的 ,看起来确实trap "" INT导致bash忽略该信号,并trap - INT导致其重置为默认处理程序。

相关内容