来自 APUE
一个进程有三种处理信号的选择。
忽略信号。不建议将此选项用于表示硬件异常的信号,例如除以零或引用进程地址空间之外的内存,因为结果未定义。
让默认动作发生。对于被零除的情况,默认是终止进程。
提供一个在信号发生时调用的函数(这称为“捕捉”信号)。通过提供我们自己的函数,我们将知道信号何时发生,我们可以随意处理它。
我认为只有两个选择——上面列出的最后两个,它们都可以“忽略信号”(上面列出的第一个选择)。
我的理解是正确的,还是在报价中确实存在三个不重叠的选择?为什么?
书中提到某些信号的默认操作是忽略它。这是否意味着信号的动作是 SIG_IGN 或 SIG_DFL 或空函数?例如:
SIGCHLD的默认操作将被忽略。我们将在第 10 章中描述这些选项。
SIGCONT: 默认 操作是继续一个停止的进程,但 如果进程没有停止则忽略该信号。
谢谢。
当然,可以编写一个什么都不做的信号处理程序,从而有效地忽略信号,但第一种选择是通过使用系统调用的
SIG_IGN
参数来专门忽略信号。signal()
所以在代码方面,假设
SIGINT
信号,这些是三个选项:signal(SIGINT, SIG_IGN);
无视signal()
函数,或调用它,signal(SIGINT, SIG_DFL);
从而让默认操作发生,即终止进程signal(SIGINT, termination_handler);
,其中termination_handler()
是第一次出现信号时调用的函数。来源:https ://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html
对于信号的特定情况,默认操作是忽略信号,前两个选项 (
SIG_IGN
和SIG_DFL
) 是相同的。创建一个空的处理函数可能不会有明显的效果,除了(小)开销。注意:
signal()
为简单起见,在此答案中使用了 ,但sigaction()
出于可移植性的原因,建议在新代码中使用。