Linux僵尸进程(Zombie or defunct)
来源:岁月联盟
编辑:exp
时间:2012-06-22
Linux僵尸进程(Zombie or defunct) 关于Linux僵尸进程,一般是由于子进程结束的时候,会有一些资源没有释放掉,直到父进程结束或者由父进程去处理它才可以! www.2cto.com 僵尸进程就是子进程已经结束,但是父进程没有处理的进程! 父进程可以使用waitpid,wait等来处理僵尸进程! if 父进程不幸在子进程之前“死了”,那么子进程就交由init( pid == 1 )进程去管理~ 我们可以测试以下: 具体的程序解释看代码的注释! [cpp]#include <stdio.h> #include <stdlib.h> #include<sys/types.h> www.2cto.com int main() { int status; if(!fork()) //!> fork一个进程 { printf("child pid=%d/n", getpid()); exit(0); } printf("请输入ps -e : 查看僵尸进程!/n"); sleep(10); //!> 让你有时间去输入ps -e查看 printf("下面让父进程wait,来处理僵尸进程,请再ps -e查看! /n"); if( waitpid(-1, &status, 0) != -1 ) //!> 参数是-1就是等待所有的子进程 { printf( "子进程退出status:%d/n", status ); } else { printf("waitpid error!/n"); exit( 1 ); } sleep(10); //!> 让你有时间去输入ps -e查看 exit(0); } www.2cto.com gcc -o 1 1.c 我的机子上运行结果: 2747 pts/0 00:00:00 bash 2768 pts/0 00:00:00 1 //!> 看:这个就是父进程 2769 pts/0 00:00:00 1 <defunct> //!> 看:这个就是子进程成为僵尸进程 2772 pts/1 00:00:00 bash 2802 pts/1 00:00:00 ps pengtao@ubuntu:~$ //!> 10s 之后我打开第二个终端ps -e 2747 pts/0 00:00:00 bash 2768 pts/0 00:00:00 1 //!> 没有咯~~~呵呵~~~ 2772 pts/1 00:00:00 bash 2805 pts/2 00:00:00 bash 2821 pts/2 00:00:00 ps pengtao@ubuntu:~$ 当然我们可以使用忽略信号,使得不产生僵尸进程! signal( SIGCHLD, SIG_IGN ); //!> 忽略产生僵尸进程 www.2cto.com [cpp]#include <stdio.h> #include <stdlib.h> #include<sys/types.h> #include <signal.h> int main() { int status; int i; signal( SIGCHLD, SIG_IGN ); //!> 忽略产生僵尸进程 for( i = 0; i < 5; i++ ) //!> 5个子进程 { if(!fork()) { printf("child pid=%d/n", getpid()); exit(0); } } printf("请输入ps -e : 查看僵尸进程!/n"); www.2cto.com sleep(10); exit(0); } gcc -o 1 1.c 3115 pts/0 00:00:00 bash 3172 pts/1 00:00:00 bash 3228 pts/0 00:00:00 1 3237 pts/1 00:00:00 ps 所以一般情况下if需要子进程的结果来做一些判断 ,那么我们应该是需要wait或waitpid的,但是很多时候是可以直接忽略的,对于僵尸进程来说,消耗的src虽然少,但是一旦僵尸建成多了也是会影响性能的,所以还是需要注意的! 作者 shanshanpt