总结:主进程分叉3个子进程,向每个进程发送信号,然后等待。反过来,当每个孩子收到信号时,它被重定向到child()函数,向主进程发送信号(并调用father()函数),然后等待。如果主进程收到3个信号,它将终止子进程并结束程序。
问题是主进程只接收一次信号。我怀疑在执行father()函数时其他2个信号丢失了,或者我可能只是遗漏了某些东西
有没有办法知道某些信号是否丢失?在那种情况下,我该如何避免这种情况?
答案 0 :(得分:0)
信号不可靠,如果您需要确保收到消息,则应避免使用。更可靠的方法是使用
答案 1 :(得分:0)
在信号处理程序中使用pause()
不允许信号再次传递。在输入信号处理程序之前,信号被屏蔽或重置为其默认操作(大多数实现都执行前者)。
另一个问题是来自kill()
的信号可能与相同信号编号的另一个实例合并。如果接收过程不能足够快地运行,则会发生这种情况:如果当另一个信号已经等待相同的信号编号时进入新信号,则可以丢弃新信号。您可以通过为每个发件人使用不同的信号编号或使用sigqueue()
以及sigaction()
安装的处理程序以及SA_SIGINFO
中sa_flags
设置的处理程序来避免这种情况。这些都无限期地缩放。
避免使用过时的函数pause()
和signal()
是明智的。最好使用sigsuspend()
和sigaction()
代替。
您可以使用sigprocmask()
或pthread_sigmask()
临时阻止信号。这样可以避免竞争条件,例如在安装处理程序之前进入的信号。
sigwait()
功能可让您处理程序主流程中的信号。
按照惯例,正常终止是使用SIGTERM
而不是SIGQUIT
完成的。请注意,SIGQUIT
的默认操作包括核心转储或类似操作。