叉和僵尸的过程

时间:2011-08-15 03:13:33

标签: linux unix process fork

我在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秒)。

所以是因为没有等待调用父出口而且孩子仍在执行?但为什么它没有出现在终端(等待)?

父母是否在这里成为僵尸?

4 个答案:

答案 0 :(得分:4)

您的观察结果是正确的。

终端等待原始进程(即父进程)退出。它不会等待任何子进程退出。

Zombies:一个进程是僵尸,如果它已经退出但它的父进程没有调用wait()。

在您的情况下,父母不会变成僵尸,因为终端正在等待它。

答案 1 :(得分:2)

  1. 祖父母从不等待孩子;没有父母的孩子被重新归属于初学者。
  2. 不,它死了。

答案 2 :(得分:0)

shell正在等待父级完成但不是孩子。

30秒后孩子变成僵尸(shell会在下一次提示时清理)。

答案 3 :(得分:0)

在第二个例子中,孩子变成了孤儿,因为父母在孩子还活着的时候已经回来了。孤儿进程属于init而不是shell,这就是它没有出现的原因。您的两个代码示例中没有僵尸。僵尸是父母还活着,孩子死了,父母不打电话等孩子变成僵尸。