如果服务器需要停止,所有程序都将被杀死,最终会出现KILL信号.现在,这可以通过遍历所有注册的PID并等待CHILD信号处理程序来删除PID.如果子程序未正确退出,则会失败.因此,我想使用kill与waitpid结合使用,以确保PID列表被清理并记录并执行其他的其他操作.
kill(pid,SIGKILL); waitpid(pid,NULL,WNOHANG);
摘录from waitpid(2):
waitpid(): on success,returns the process ID of the child whose state has changed; if WNOHANG was specified and one or more child(ren)
specified by pid exist,but have not yet changed state,then 0 is returned. On error,-1 is returned.
解决方法
Is the process given by pid always gone before the next function kicks in?
没有保证.在多处理器上,您的进程可能在cpu 0上,而内核中的被杀死进程的清理发生在cpu 1上.这是一个古典的竞争条件.即使在单核处理器上也不能保证.
Will waitpid always return -1 in the above case?
由于它是一种竞争条件 – 在大多数情况下也许会这样.但是没有保证.
由于你对状态不感兴趣,所以在这种情况下,这个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;
原文地址:https://www.jb51.cc/c/112553.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。