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