0

我有一个像这样工作的多进程应用程序......

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

这工作正常,但我正在努力处理被杀死的父进程。

发生的情况是父母收到一个 SIGINT(来自 CTRL-C),然后向每个孩子发送 SIGKILL。如果子进程在接收到该信号时正在阻塞 Sys V 消息队列写入,则写入被信号“中断”并且阻塞取消,并且父进程永远不会知道子进程的工作已经完成,并且数据库永远不会更新.

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

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

4

1 回答 1

0

好吧SIGKILL,根据定义,对接收它的进程来说是立即致命的,并且无法被捕获或处理。

这就是为什么您应该只将它用作最后的手段,当进程没有响应更礼貌的关闭请求时。你的父进程应该从向子进程发送类似SIGINT或的东西开始,并且只有在他们没有在合理的时间内退出时SIGTERM才会重置。SIGKILL

SIGINT和之类的信号SIGTERM可能仍然会导致子系统调用返回,EINTR但您可以处理它并重试调用并让它在退出之前完成。

于 2013-01-22T22:40:11.267 回答