我有一个父进程产生了几个子进程。我想知道何时通过注册SIGCHLD
信号处理程序退出任何子进程。
问题是,如果SIGCHLD
父进程已经在信号处理程序中,而又收到另一个(或任何其他信号),会发生什么?
我可以想到以下结果:
哪一个是正确的?
在您的具体示例中(接收到相同的信号),信号在信号处理程序完成之后被传递(因此,项目要点2是正确的)。但是请注意,您可能会“丢失”信号。
这样做的原因是,当信号在其处理程序中时,它被阻止了。被阻止的信号被设置为未决,但未排队。术语“待定”表示操作系统记住有一个信号等待下一个机会传递,而“未排队”表示操作系统通过在某处设置标志来实现此目的,而不是通过保留有关如何执行的确切记录来进行。许多信号已经到达。
因此,你可以更收到2或3(或10) SIGCHLD
,而在你的处理器,但只看到一个(所以在某些情况下,子弹点#1 可以是正确的,太)。
请注意,您可以传递的几个标志sigaction
可能会影响默认行为,例如SA_NODEFER
(防止阻塞信号)和SA_NOCLDWAIT
(在某些系统上可能根本不产生信号)。
当然,现在,如果您收到其他类型的信号,则无法保证它不会中断您的处理程序。因此,最好不要使用非信号安全功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句