【问题标题】:Is it a zombie?它是僵尸吗?
【发布时间】:2013-09-24 09:30:05
【问题描述】:

我对下面的代码有些疑问。

#include <stdio.h>
#include <sys/types.h>

int main(void)
{
    int pid=fork();
    if(pid==0) sleep(5);
    printf("Hello World %d %d\n",getpid(),pid);
    if(pid>0) while(1){sleep(1);}
    if(pid==0) printf("In child process!\n");
    return 0;
}

子进程会终止吗?它会保持僵尸状态吗?

【问题讨论】:

  • 一个在僵尸进程结束时留下来的进程,它的 pid 只是没有从进程列表中删除,以便让父进程有机会注意到子进程的终止。为此,父母应调用wait()waitpid() 或忽略SIGCHLD 信号。

标签: c unix operating-system system-calls zombie-process


【解决方案1】:

在您的示例中,子进程死亡,但父进程不知道它的 exit 状态。因此,孩子(现在是 zombie)留在进程表中。

此外,父级继续等待子级并继续运行。

【讨论】:

  • 是不是这样,除非并且直到父母执行 wait(),否则孩子会重新成为僵尸(假设孩子先完成)?
  • 不“释放”孩子的可能用途是什么?
  • @user2545792:为了避免比赛。
  • @alk 你能详细说明一下吗?
  • @user2545792:所有父母都知道它的孩子是孩子的pid。如果子进程结束后立即离开,它的 pid 可能会被另一个进程接管,后者可能在父进程没有意识到的情况下发生,这反过来可能导致父进程假设 的“误解”新的 进程现在携带父母(已经结束)的孩子的pid 它的孩子。如果父母依赖孩子的存在,这将是致命的。
【解决方案2】:

是的,它是僵尸......您的子进程死亡,您的父进程不知道子进程的退出状态。即使孩子死了,父进程仍在运行。

ZOMBIE 进程:当子进程死亡时,父进程仍在运行。在这种情况下,父进程不知道子进程的退出状态。
为避免此父进程使用waitwaitpid 来了解child status

【讨论】:

    【解决方案3】:

    添加到其他响应.. 如果相反的情况发生,即父进程在子进程完成之前死亡,那么子进程将成为 孤儿 并随后被特殊系统“收养”进程调用 init

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 2020-05-19
      相关资源
      最近更新 更多