我在fork上尝试一些简单的代码。当我给出这样的代码时,它工作正常。它会打印
我是孩子
我是父母
然后等待30秒。我理解这是由于这两个过程之间的转换。第一个孩子然后执行父母,然后是孩子......
#include<stdio.h>
#include<stdlib.h>
main()
{
int pid;
pid=fork();
if(pid==0)
{
printf("\nI am the child\n");
sleep(30);
exit(0);
}
if(pid>0)
{
printf("\nI am the parent\n");
wait();
}
}
但是当我给予喜欢(没有在父母那里等待)时
#include<stdio.h>
#include<stdlib.h>
main()
{
int pid;
pid=fork();
if(pid==0)
{
printf("\nI am the child\n");
sleep(30);
exit(0);
}
if(pid>0)
{
printf("\nI am the parent\n");
}
}
它只是打印
我是孩子
我是父母
并退出(不等待30秒)。
所以是因为没有等待调用父出口而且孩子仍在执行?但为什么它没有出现在终端(等待)?
父母是否在这里成为僵尸?
答案 0 :(得分:4)
您的观察结果是正确的。
终端等待原始进程(即父进程)退出。它不会等待任何子进程退出。
Zombies:一个进程是僵尸,如果它已经退出但它的父进程没有调用wait()。
在您的情况下,父母不会变成僵尸,因为终端正在等待它。
答案 1 :(得分:2)
答案 2 :(得分:0)
shell正在等待父级完成但不是孩子。
30秒后孩子变成僵尸(shell会在下一次提示时清理)。
答案 3 :(得分:0)
在第二个例子中,孩子变成了孤儿,因为父母在孩子还活着的时候已经回来了。孤儿进程属于init而不是shell,这就是它没有出现的原因。您的两个代码示例中没有僵尸。僵尸是父母还活着,孩子死了,父母不打电话等孩子变成僵尸。