处理信号的选择?

处理信号的选择?

来自APUE

进程有三种处理信号的选择。

  1. 忽略信号。对于表示硬件异常的信号,例如除以零或引用进程地址空间之外的内存,不建议使用此选项,因为结果未定义。

  2. 让默认操作发生。对于被零除的情况,默认是终止进程。

  3. 提供一个在信号发生时调用的函数(这称为“捕获”信号)。通过提供我们自己的函数,我们将知道信号何时发生,并且我们可以按照我们的意愿处理它。

  1. 我认为只有两个选择 - 上面列出的最后两个,并且它们都可以“忽略信号”(上面列出的第一个选择)。

    我的理解是否正确,或者确实存在引用中的三个不重叠的选择?为什么?

  2. 书中提到,某些信号的默认操作是忽略它。这是否意味着信号的动作是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_IGNSIG_DFL)是相同的。除了(小)开销之外,创建一个空处理函数可能不会产生明显的效果。

注意:signal()为了简单起见,在这个答案中使用了 ,但sigaction()出于可移植性的原因,建议在新代码中使用 。

相关内容