KILL信号是否立即退出进程?
我正在使用一个使用fork()和exec创建子进程的服务器代码.当fork()成功并在CHILD信号被捕获时被清除,该小孩的PID被注册.
如果服务器需要停止,所有程序都将被杀死,最终会出现KILL信号.现在,这可以通过遍历所有注册的PID并等待CHILD信号处理程序来删除PID.如果子程序未正确退出,则会失败.因此,我想使用kill与waitpid结合使用,以确保PID列表被清理并记录并执行其他的其他操作. 考虑下一个代码示例: kill(pid,SIGKILL); waitpid(pid,NULL,WNOHANG); 摘录from waitpid(2):
在下一个功能开始之前,pid给出的过程是否总是消失?在上述情况下waitpid总是返回-1吗? 解决方法
没有保证.在多处理器上,您的进程可能在CPU 0上,而内核中的被杀死进程的清理发生在CPU 1上.这是一个古典的竞争条件.即使在单核处理器上也不能保证.
由于它是一种竞争条件 – 在大多数情况下也许会这样.但是没有保证. 由于你对状态不感兴趣,所以在这种情况下,这个semicode可能更合适: // kill all childs foreach(pid from pidlist) kill(pid,SIGKILL); // gather results - remove zombies while( not_empty(pidlist) ) pid = waitpid(-1,WNOHANG); if( pid > 0 ) remove_list_item(pidlist,pid); else if( pid == 0 ) sleep(1); else break; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |