2010-10-04 198 views
12

心中已经对僵尸的一些问题处理僵尸进程

  • 从什么僵尸进程概念的好处是什么?
  • 知道内核维护(PID,终止状态,资源使用信息)僵尸进程
    什么的“资源使用信息”
  • 如何僵尸的PPID()= 1,它仍然僵尸的意思,(INIT收获僵尸,因为它等待()默认)
    可以任何一个写一些C代码作出僵尸它的父母是初始?
  • 僵尸可以拒绝释放内存锁吗?

由于事先

+0

属于superuser.com – 2010-10-04 17:46:18

+10

@Paul R我不这么认为,这件事情是根据系统编程进行的。 – Searock 2010-10-04 17:54:30

回答

12

- 僵尸过程概念有什么好处?

僵尸进程只是一个pid,退出状态和一些会计信息,直到父母使用wait系列调用系列之一才能获得其最终状态。在父母呼叫wait之前,孩子的进程ID必须保持标记为已使用状态,以便不能为其分配任何其他进程。如果另一个进程被分配了一个回收的pid,那么很难区分它和以前具有相同pid的进程之间的区别。一旦父母调用wait并返回最终退出状态,可以假定没有人会再次在该pid处查找孩子,所以现在可以重新使用该pid。 (我想在Linux上,如果父母离开SIGCHLD为SIG_IGN内核将不会保持周围的僵尸,但重新注册SIGCHLD的配置为SIG_IGN不会有同样的效果)

- 知道内核维护(PID ,终止状态,资源使用信息)僵尸进程什么的“资源使用信息”

有些信息是什么运行的程序的含义:

time my_program 

将报告。这些值通常在SIGCHLD的siginfo结构中报告(它不完全是对wait的调用),但也可通过调用系统调用(在某些系统上)的waitid形式获得。有关此结构的信息,请参阅man sigaction

- 僵尸的PPID()如何= 1,它仍然僵尸,(INIT收割植物大战僵尸,因为它等待()默认情况下)

僵尸其PPID = 1不应该留一个僵尸很长时间,因为init应该很快收获。一个僵尸程序在它死后不久(即通过exit或杀死它的无用信号),直到它的父母呼叫wait并获得它的最终状态后,它仍然是僵尸。这意味着,即使init不做任何事情,但会一次又一次地调用init,可能会有少量时间将进程显示为僵尸。如果进程显示为init(0 = ppid)的子进程长时间(秒),则可能有错误。

- 任何一个可以写一些C代码来做一个僵尸它的父母是Init?

这是不明确的,但我想你想:

pid_t f = fork(); 
if (f > 0) { 
    exit(0); // this is the parent dying, so the child will be an orphan 
      // and get adopted by init 
} else if (f == 0) { 
    sleep(100); // This is the child doing something that takes enough time for 
       // its parent to commit suicide (exit(0)) and then for you to 
       // observe that it has now been adopted by init 
    exit(0); // And now it dyes as well, so init should reap its status, but 
       // it may be a zombie for a short amount of time first. 
} else /* error condition would be handled here */ 

- 可僵尸拒绝释放内存的一些锁?

僵尸不能容纳任何东西。他们失去了所有的内存页面,打开文件句柄等等。几乎所有的操作系​​统都可以弄清楚如何释放应该被释放。这不是一个错误,但要记住,操作系统必须知道它是应该被释放的东西。在用户空间创建资源非常简单,当程序死亡时应该释放操作系统不知道应该释放的资源。

+0

看@这个,你会知道我的意思关于第3点http://stackoverflow.com/questions/1907775/init-never-reaping-zombie-defunct-processes – Aboelnour 2010-10-04 19:35:08

+3

@Aboelnour:或者有一个或多个内核错误或_init_,出于某种原因,_init_已经死亡(我不知道如果_init_死了会发生什么),根发送SIGSTP到_init_,或者_init_运行速度非常慢。这不应该发生。 – nategoose 2010-10-04 20:20:42

3

甲僵尸进程是一个纯粹的PID和退出状态值。由于资源(pid)“属于”父项,因此无法释放pid。如果它被释放,另一个进程可能会被分配相同的pid,然后父进程可能会发送信号到一个不相关的进程;即使父母第一次等待确定孩子是否退出,也无法避免竞争条件。

+0

...我想我错过了一些东西。你正在从事什么僵尸进程的定义? – 2010-10-04 17:46:54

+2

已退出,但其父母未通过“waitpid”或类似接口获得退出状态通知的子进程。 – 2010-10-04 17:56:35

+0

啊,是的。抱歉。我只是意识到我一直在读“僵尸”,并想着“孤儿”。谢谢。 – 2010-10-04 18:16:16

2

如果您有兴趣了解正在运行的进程列表中的僵尸进程使用:

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

int main(void) 
{ 
    pid_t p = fork(); // creates child process and stores the returned PID 

    if (p != 0)   // executed by parent process 
    { sleep(1);  /* the child process terminates while the parent process sleeps, 
          the child then becomes a zombie process because the returned status 
          of the terminated child process isn't checked via a wait() */ 

     system("ps -eo pid,ppid,stat,cmd"); // prints a list of processes in your terminal 

    } 
    else  // executed by child process 
    { 
     exit(0);  // the child process terminates immediately 
    } 

    return 0; 
} 

您可以通过Z +识别僵尸进程列表:

screenshot of the zombie process

注意:如果您使用的是Windows,则必须修改代码。