我正在开发一个使用的服务器代码fork()
并执行创建子进程。孩子的PID在以下情况下被注册fork()
成功并清理时CHILD
信号已被捕获。
如果服务器需要停止,所有程序都会被终止,最终会发出 KILL 信号。现在,这是通过迭代所有注册的 PID 并等待 CHILD 信号处理程序删除 PID 来实现的。如果子程序没有正确退出,这将失败。因此我想用kill
结合waitpid
确保 PID 列表被清理并记录并执行其他一些操作。
考虑下一个代码示例:
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
摘自waitpid(2)
:
waitpid():成功时,返回状态已更改的子进程的进程 ID;如果指定了 WNOHANG 且有一个或多个孩子
指定的pid存在,但状态尚未改变,则返回0。出错时,返回-1。
给出的过程是pid
在下一个功能启动之前总是消失?将要waitpid
总是回来-1
在上述情况下?
在下一个函数启动之前,pid 给出的进程总是消失吗?
对此没有任何保证。在多处理器上,您的进程可能位于 CPU 0 上,而内核中对被杀死进程的清理则发生在 CPU 1 上。这是典型的竞争条件。即使在单核处理器上也不能保证这一点。
在上述情况下waitpid总是返回-1吗?
由于这是一个竞争条件 - 在大多数情况下它可能会。但没有任何保证。
由于您对状态不感兴趣,因此以下半代码可能更适合您的情况:
// kill all childs
foreach(pid from pidlist)
kill(pid, SIGKILL);
// gather results - remove zombies
while( not_empty(pidlist) )
pid = waitpid(-1, NULL, WNOHANG);
if( pid > 0 )
remove_list_item(pidlist, pid);
else if( pid == 0 )
sleep(1);
else
break;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)