【问题标题】:how this program creates zombie process?这个程序如何创建僵尸进程?
【发布时间】:2011-08-11 11:48:01
【问题描述】:

下面的程序是如何工作的,如何在linux下创建一个Zombie进程?

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{
  pid_t child_pid;

  child_pid = fork ();
  if (child_pid > 0) {
    sleep (60);
  }
  else {
    exit (0);
  }
  return 0;
}

【问题讨论】:

    标签: c linux process zombie-process


    【解决方案1】:

    它会创建孩子并且不会等待(使用 wait* 系统调用之一)为他们。僵尸就是这样:父母还没有等待的孩子,内核必须为他们维护一些信息——主要是退出状态——以便能够将其返回给父母。

    【讨论】:

    • 同意,而未来的僵尸正在等待父母死亡。 :)
    • @Rolice,与 Cicida 相同:它是休眠的父级(通过 fork 获取子级的 pid),子级(通过 fork 获取 0)立即返回. (并且您在缺少等待系统调用的上下文中对睡眠进程使用等待可能会令人困惑)。
    • @anishsane,僵尸已经死了(被终止了),但父母没有也没有等待他们。孤儿没有死,但有父母,它们已被等待它们的进程 1 收养。
    • 然后,在他的示例中,if 块是子块并且存活了 60 毫秒,而父块已经退出。孩子不是孤儿进程吗?
    • @anishsane if 块是父块(fork() 的返回值 > 0)
    【解决方案2】:

    setsid() 命令丢失。

    每个 *nix 进程都会产生一个必须被回收的退出状态。如果子进程应该首先终止,那么这应该由父进程使用 wait() 语句来获得。

    当父进程在子进程之前终止时,setsid() 命令将父进程切换为 init。

    root 应该能够使用 kill -9 从进程列表中删除僵尸。没有经验的程序员有时会忽略setsid(),这将隐藏产生错误的错误,否则会阻塞磁盘驱动器。

    在过去,系统管理员会使用僵尸来识别需要额外培训才能编写出好的代码的缺乏经验的程序员。

    当内核过早终止程序时,init 获取的退出状态会发送到 syslog。该退出状态用于识别导致提前终止的错误的性质(程序员未处理的错误情况)。

    以这种方式报告的退出状态成为 syslog 或 klog 文件的一部分,这些文件通常用于调试代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 2016-12-13
      • 2014-01-03
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多