zombie process



产生一个僵尸,ps里标记为Z。个人理解为:从前一个父亲,他比较二,生了一个儿子,生完以后就丢下不管了,让他自生自灭。
而有一天儿子结束了他的生命,父亲也找不到他,没有给他安葬,于是他心怀不满,变成了僵尸残害人类。

也即parent fork()出一个child,但是没有提供一个函数来接受child terminate后的status,于是child便没有归宿了。哈哈。

下面程序里产生了一个僵尸,单看main(),将waitpid()注释掉,即parent没有wait child.里面调用system()来执行一个shell command.
[codes=C]
/* In UNIX System terminology,a process that has terminated ,but whose parent has not yet waited for it ,is called a zombie.
* ex8_6.c
*
*  Created on: 2009-8-13
*      Author: lengyuex
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MAXLINE 4096
void err_sys(const char *,...);
static void err_diot(int,int,const char *,va_list);
#define PSCMD "ps -a -o pid,ppid,s,tty,comm"
int main(void)
{
  pid_t pid;
  if ((pid=fork())    err_sys("fork error");
  else if (pid==0)         /* child */
    exit (0);

  system (PSCMD);       /* parent */
  sleep (4);
  //system (PSCMD);
  /*if (waitpid(pid,NULL,0)!=pid)
    err_sys("waitpid error");*/
  system (PSCMD);
  exit (0);
}
static void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
  char  buf[MAXLINE];

  vsnprintf(buf, MAXLINE, fmt, ap);
  if (errnoflag)
    snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
      strerror(error));
  strcat(buf, "\n");
  fflush(stdout);    /* in case stdout and stderr are the same */
  fputs(buf, stderr);
  fflush(NULL);    /* flushes all stdio output streams */
}
void err_sys(const char *fmt, ...)
{
  va_list    ap;

  va_start(ap, fmt);
  err_doit(1, errno, fmt, ap);
  va_end(ap);
  exit(1);
}[/codes]
-----------------------

$ ./a.out
  PID  PPID S TT       COMMAND
2621  2574 S tty1     startx
2637  2621 S tty1     xinit
4128  3374 S pts/0    a.out
4129  4128 Z pts/0    a.out
4130  4128 R pts/0    ps
  PID  PPID S TT       COMMAND
2621  2574 S tty1     startx
2637  2621 S tty1     xinit
4128  3374 S pts/0    a.out
4129  4128 Z pts/0    a.out
4131  4128 R pts/0    ps

posted @ 2009-08-15 17:56  冷月X  阅读(222)  评论(0编辑  收藏  举报