【发布时间】:2014-01-03 03:06:04
【问题描述】:
我想知道下面的代码是否可以创建僵尸:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int i=1;
pid_t p;
p = fork();
i++;
if(p!=0){
waitpid(p, NULL, 0);
}
printf("%d\n",i);
return 0;
}
因此,父进程调用子进程的waitpid,如果子进程尚未退出,则立即返回。所以,到目前为止,还没有僵尸出现。但是,如果孩子在
之前退出return 0;命令这会是僵尸吗?我实际上对此感到困惑。 waitpid 是否应该是程序终止前的最后一行代码?任何帮助,将不胜感激。谢谢!
【问题讨论】:
-
看起来不错,但您可能有误解。如果孩子已经死亡,
waitpid将立即返回;否则它将阻塞,直到孩子死去。除非您将 WNOHANG 与 waitpid 一起使用,否则它不会阻塞,但这不是问题。 -
如果我错了,请纠正我,但我认为第三个参数(零)相当于WHOHANG。无论如何,让我们假设它是WHOHANG。然后会创建一个僵尸吗?如何创建?最后,waitpid 是否应该是 return 0 之前的最后一个命令?以确保不会创建僵尸?再次感谢!
-
No WNOHANG 绝对不等于 0。零是默认值,如果等于 0,则按位或 WNOHANG 没有意义。如果孩子在非阻塞
waitpid后死亡并且父母先退出然后你会有一个僵尸。但通常您会在循环中使用非阻塞waitpid,并可能与接收 SIGCHLD 结合使用。 Waitpid 本身可以在代码中的任何位置,只要它在被调用时处理您的孩子。 -
感谢您的回复!我还有一个问题:如果父进程在孩子死之前调用
waitpid(p, NULL, WHOHANG);,那么孩子会变成僵尸,对吗?那么,在上面的代码中,是什么阻止了孩子在waitpid的调用后死亡并因此成为僵尸? -
在上面的代码中,您没有使用 WNOHANG,因此有两种情况。 (1) 当
waitpid被调用并且waitpid 立即收获并返回时,孩子已经死了。 (2) 孩子还没有死,waitpid阻塞等待孩子死亡。当它完成时,它会被收割并 waitpid 返回。希望对您有所帮助。
标签: c process pid zombie-process waitpid