我正在编写使用 fork()
和 exec 创建子进程的服务器代码。 child 的 PID 在 fork()
成功时注册,并在 CHILD
信号被捕获时清除。
如果服务器需要停止,所有程序都会被终止,最终会发出 KILL 信号。现在,这是通过遍历所有已注册的 PID 并等待 CHILD 信号处理程序删除 PID 来实现的。如果子程序没有正确退出,这将失败。因此,我想将 kill
与 waitpid
结合使用,以确保清理 PID 列表并记录并做一些其他事情。
考虑下一个代码示例:
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
摘自 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.
pid
给出的进程是否总是在下一个函数启动之前就消失了?在上述情况下,waitpid
是否总是返回 -1
?
最佳答案
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?
因为这是一个竞争条件——在大多数情况下它可能会。但不能保证。
由于您对状态不感兴趣,此半代码可能更适合您的情况:
// 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;
关于c - KILL 信号是否立即退出进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8679226/