【问题标题】:Fork and Zombie process分叉和僵尸进程
【发布时间】:2011-08-15 03:13:33
【问题描述】:

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

是不是因为没有等待调用父级退出而子级仍在执行?但是为什么它没有出现在终端(等待)?

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

【问题讨论】:

  • 请不要使用那么多问号。 ;-)

标签: linux unix process fork


【解决方案1】:

你的观察是正确的。

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

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

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

【讨论】:

    【解决方案2】:
    1. 是的。
    2. 祖父母从不伺候孩子;没有父级的子级被重新设置为 init。
    3. 不,它死了。

    【讨论】:

    • 3 需要澄清。僵尸也死了。
    【解决方案3】:

    shell 正在等待父进程完成,而不是子进程。

    孩子在 30 秒后变成僵尸(shell 将在下一个提示符下清理)。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2011-11-09
        • 2014-09-30
        相关资源
        最近更新 更多