系统V msg_send被SIGKILL中断

时间:2013-01-22 21:18:35

标签: linux system ipc sysv

我有一个多进程应用程序,就像这样......

有一个父进程。父进程查询数据库以查找工作,然后让子进程处理该工作。孩子们通过System V消息队列与父母进行通信,以表明他们已经完成了他们的工作。当父进程选择该消息时,它会更新数据库以指示工作已完成。

这没关系,但我正在努力处理被杀的父进程。

父进程收到SIGINT(来自CTRL-C),然后将SIGKILL发送给每个子进程。如果一个孩子当前在Sys V消息队列中阻塞,当它收到该信号时写入,写入被信号“中断”并且阻塞被取消,父母从未得知孩子的工作已完成,并且数据库永远不会更新

这意味着下次运行脚本时,它将重新运行在System V队列写入时阻塞的任何工作。

我还没有一个好主意来解决这个问题。理想情况下,我希望能够强制队列写入保持阻塞,即使它收到SIGKILL但我不认为这样的事情是可能的。

1 个答案:

答案 0 :(得分:0)

根据定义,SIGKILL对于接收它并且不能被捕获或处理的过程立即致命。

这就是为什么当流程没有响应更多有礼貌的关闭请求时,你应该只将它作为最后的手段。您的父进程应首先向子项发送SIGINTSIGTERM之类的内容,如果未在合理的时间内退出,则仅重置为SIGKILL

SIGINTSIGTERM之类的信号可能仍会导致子系统中的系统调用返回EINTR,但您可以处理该操作并重试调用并在退出之前完成调用