如何在不丢失信号的情况下将多个孩子的信号发送到主过程?

时间:2014-01-03 22:36:48

标签: c unix signals ipc

Full program

总结:主进程分叉3个子进程,向每个进程发送信号,然后等待。反过来,当每个孩子收到信号时,它被重定向到child()函数,向主进程发送信号(并调用father()函数),然后等待。如果主进程收到3个信号,它将终止子进程并结束程序。

问题是主进程只接收一次信号。我怀疑在执行father()函数时其他2个信号丢失了,或者我可能只是遗漏了某些东西

有没有办法知道某些信号是否丢失?在那种情况下,我该如何避免这种情况?

2 个答案:

答案 0 :(得分:0)

信号不可靠,如果您需要确保收到消息,则应避免使用。更可靠的方法是使用

  1. 共享内存
  2. 插座
  3. 文件

答案 1 :(得分:0)

在信号处理程序中使用pause()不允许信号再次传递。在输入信号处理程序之前,信号被屏蔽或重置为其默认操作(大多数实现都执行前者)。

另一个问题是来自kill()的信号可能与相同信号编号的另一个实例合并。如果接收过程不能足够快地运行,则会发生这种情况:如果当另一个信号已经等待相同的信号编号时进入新信号,则可以丢弃新信号。您可以通过为每个发件人使用不同的信号编号或使用sigqueue()以及sigaction()安装的处理程序以及SA_SIGINFOsa_flags设置的处理程序来避免这种情况。这些都无限期地缩放。

避免使用过时的函数pause()signal()是明智的。最好使用sigsuspend()sigaction()代替。

您可以使用sigprocmask()pthread_sigmask()临时阻止信号。这样可以避免竞争条件,例如在安装处理程序之前进入的信号。

sigwait()功能可让您处理程序主流程中的信号。

按照惯例,正常终止是使用SIGTERM而不是SIGQUIT完成的。请注意,SIGQUIT的默认操作包括核心转储或类似操作。