我有一个像这样的多进程应用程序...
有一个父进程。父进程查询数据库以查找工作,然后派生子进程处理该工作。子级通过System V消息队列与父级通信,以指示他们完成了工作。当父进程收到该消息时,它将更新数据库以指示工作已完成。
这样做可以,但是我正在努力处理被杀死的父进程。
发生的是父级从CTRL-C接收到SIGINT,然后将SIGKILL发送给每个子级。如果子级在接收到该信号时当前正在Sys V消息队列写操作上进行阻止,则该写操作会被该信号“中断”并取消阻止,而父级则永远不会得知该子级的工作已经完成,并且数据库也永远不会更新。
这意味着下次我运行该脚本时,它将重新运行在System V队列写操作中阻塞的所有工作。
我还没有解决这个问题的好主意。理想情况下,我希望能够强制队列写入即使在收到该SIGKILL时也保持阻塞,但我认为这种事情是不可能的。
最佳答案
根据定义,SIGKILL
井对接收它的过程立即致命,并且无法被捕获或处理。
这就是为什么当进程不响应更礼貌的关闭请求时,您只能将其用作最后的选择的原因。您的父进程应该通过向子进程发送诸如SIGINT
或SIGTERM
之类的东西开始,并且仅当它们在合理的时间内没有退出时才重置为SIGKILL
。
像SIGINT
和SIGTERM
这样的信号可能仍然会导致使用EINTR
返回子级中的系统调用,但是您可以处理该问题并重试该调用,并在退出之前使其完成。
关于linux - SIGKILL中断了系统V msg_send,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14468184/