来自APUE
进程有三种处理信号的选择。
忽略信号。对于表示硬件异常的信号,例如除以零或引用进程地址空间之外的内存,不建议使用此选项,因为结果未定义。
让默认操作发生。对于被零除的情况,默认是终止进程。
提供一个在信号发生时调用的函数(这称为“捕获”信号)。通过提供我们自己的函数,我们将知道信号何时发生,并且我们可以按照我们的意愿处理它。
我认为只有两个选择 - 上面列出的最后两个,并且它们都可以“忽略信号”(上面列出的第一个选择)。
我的理解是否正确,或者确实存在引用中的三个不重叠的选择?为什么?
书中提到,某些信号的默认操作是忽略它。这是否意味着信号的动作是SIG_IGN或SIG_DFL或空函数?例如:
这默认SIGCHLD 的操作是被忽略。我们将在第 10 章中描述这些选项。
信号控制: 默认 操作是继续停止的进程,但是 忽略如果进程没有停止则发出信号。
谢谢。
答案1
当然,可以编写一个不执行任何操作的信号处理程序,从而有效地忽略该信号,但第一个选项是通过使用系统调用的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()
出于可移植性的原因,建议在新代码中使用 。