我有一个跨越多个子进程的父进程。我想通过注册SIGCHLD
信号处理程序来了解任何子进程何时退出。
问题是,如果收到另一个SIGCHLD
(或任何其他信号),而父进程已经在信号处理程序中会发生什么?
我可以想到以下结果:
哪一个是正确的?
答案 0 :(得分:5)
在您的具体示例中(接收到相同的信号),信号在信号处理程序完成后传递(因此项目符号#2正确)。但请注意,您可能会“丢失”信号。
原因是当信号在其处理程序内时,它被阻止。被阻止的信号被设置为待处理,但没有排队。术语“待定”表示操作系统记住在下次机会中有等待传递的信号,“未排队”意味着它通过在某处设置标志来执行此操作,但不是通过保留如何准确记录许多信号已经到来。
因此,您在处理程序中可能会收到2或3(或10)个SIGCHLD
,但只能看到一个(因此在某些情况下,项目符号#1 可以正确) ,也是)。
请注意,您可以传递给sigaction
的几个标志会影响默认行为,例如SA_NODEFER
(阻止阻塞信号)和SA_NOCLDWAIT
(可能根本不会生成信号)系统)。
当然,如果您收到不同类型的信号,则无法保证它不会中断您的处理程序。因此,最好不使用非信号安全功能。