在信号处理程序中收到信号时会发生什么?

时间:2013-08-26 10:35:21

标签: linux signals

我有一个跨越多个子进程的父进程。我想通过注册SIGCHLD信号处理程序来了解任何子进程何时退出。

问题是,如果收到另一个SIGCHLD(或任何其他信号),而父进程已经在信号处理程序中会发生什么?

我可以想到以下结果:

  • 信号被忽略
  • 信号已排队,并将在当前处理程序返回
  • 后立即处理
  • 当前处理程序又被中断,就像主程序
  • 一样

哪一个是正确的?

1 个答案:

答案 0 :(得分:5)

在您的具体示例中(接收到相同的信号),信号在信号处理程序完成后传递(因此项目符号#2正确)。但请注意,您可能会“丢失”信号。

原因是当信号在其处理程序内时,它被阻止。被阻止的信号被设置为待处理,但没有排队。术语“待定”表示操作系统记住在下次机会中有等待传递的信号,“未排队”意味着它通过在某处设置标志来执行此操作,但不是通过保留如何准确记录许多信号已经到来。

因此,您在处理程序中可能会收到2或3(或10)个SIGCHLD,但只能看到一个(因此在某些情况下,项目符号#1 可以正确) ,也是)。

请注意,您可以传递给sigaction的几个标志会影响默认行为,例如SA_NODEFER(阻止阻塞信号)和SA_NOCLDWAIT(可能根本不会生成信号)系统)。

当然,如果您收到不同类型的信号,则无法保证它不会中断您的处理程序。因此,最好不使用非信号安全功能。