vim zombie.c
---------------------------
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
int i;
pid_t pid;
for (i = 0; i < 10; ++i)
{
pid = fork();
switch(pid)
{
case -1:
perror("fork");
exit(-1);
case 0: //child
printf("I am child");
exit(0);
default:
break;
}
}
while (1)
{
sleep(1);
printf("I am parent\n");
}
return 0; //will never reach here
}
-----------------------------------------------
这段程序就可以产生10个僵尸进程,编译执行后ps -ef查看,<defunct>就表示僵尸进程。原理是产生子进程之后它只打印一句话就退出,而父进程最终进入while无限循环,所以不退出,并且它没有调用wait()或者waitpid()函数清理子进程,所以子进程全部成为僵尸进程;如果父进程退出,那么不会产生僵尸进程,因为子进程被过继给1号进程(init进程),init进程负责清理子进程。
编译生成zombie文件,并运行zombie
gcc -o zombie zombie.c
./zombie
查出僵尸进程:
top
ps -e -o stat,ppid|grep -e '^[Zz]'
杀死僵尸进程:
kill -HUP `ps -e -o stat,ppid|grep -e '^[Zz]'|awk '{print $2}'|sort|uniq`
本文转自leonardos51CTO博客,原文链接: http://blog.51cto.com/leomars/1888777,如需转载请自行联系原作者