Linux僵尸进程(Zombie or defunct)


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

相关内容

    暂无相关文章