linux僵尸进程

原创 2016年09月18日 16:38:10

定义

僵尸进程是指子进程退出时,父进程并未对其发出的SIGCHILD信号进行适当处理,导致子进程停留在僵尸状态等待其父进程为其收尸,这个状态下的子进程就是僵尸进程。

实例

#include<stdio.h>
#include<stdlib.h>
#include<error.h>
int main(int argc,char *argv[]){    
    int pid,i;
    pid = fork();
    switch(pid){
        case 0: //子进程
            printf("child start\n");
            //睡眠10s
            sleep(10);
            printf("child end\n");
            break;
        case -1: 
            perror("fork failed\n");
            break;
        default://父进程
            printf("parent over\n");    
    }   
    return 0;   
}

这里写图片描述
这里写图片描述
从上面的运行结果可以看出,父进程在子进程运行未结束前退出,导致子进程被int进程接管(此时父进程id变更为1)。待子进程运行接触后,子进程资源回被回收。

大约10秒后子进程被系统回收了,如下图:
这里写图片描述

解决方法

针对上面的情况,c语言提供了wait和waitpid方法,用于捕获子进程退出的信号,从而能有效地避免子进程出现“僵尸”状态的现象。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<error.h>
int main(int argc,char *argv[]){
    int pid,i;
    pid = fork();
    switch(pid){
        case 0:
            printf("child start\n");
            sleep(10);
            printf("child end\n");
            break;

        case -1: 
            perror("fork failed\n");
            break;

        default:
            waitpid(pid, NULL, 0); 
            printf("parent over\n");    
    }   
    return 0;   
}

运行结果如下:
这里写图片描述
这里写图片描述

总结

在使用fork()创建子进程时,应尽量避免出现”僵尸进程”的情况。虽然子进程处于”僵尸”状态时,系统会将子进程交给init进程接管, 但此时子进程的占用资源并未得到释放。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux中的僵尸进程

  • 2012年05月21日 11:26
  • 6KB
  • 下载

Linux避免僵尸进程

  • 2013年04月28日 13:49
  • 177KB
  • 下载

Linux僵尸进程详细解析

from:http://blog.sina.com.cn/s/blog_50d5fe620100g2x0.html 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父...

linux_wait()与僵尸进程

linux_wait()与僵尸进程      在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid) 他, 那么他将变成一个僵尸进程. 但是如果该进...

Linux下如何防止僵尸进程的出现

今天碰到一个老问题,就是防止僵尸进程的出现,于是又在网上学习了一遍,写到这里,防止以后不再有一个地方重新学习,:)一、什么是僵尸进程这个首先要了解一下linux下的进程在结束的时候会做什么事情。lin...

说说Linux中的信号处理和僵尸进程的避免

 什么僵尸进程 这里简单说一下,详细的到网上搜一下就知道了:僵尸进程就是指子进程退出了,而父进程尚未退出,并且没有对子进程进行wait,致使子进程的资源得不到释放,依然占据在内存中,从而变成了像"僵尸...

linux/unix僵尸进程(转自http://www.cnblogs.com/newpanderking/p/3784328.html)

什么是僵尸进程?

Linux如何杀死僵尸进程

收到报警邮件,说一个服务器的僵尸进程数大于15个。 登录服务器查了一下,发现直接 kill -9 PID 无法杀死僵尸进程,后来查了下资料解决了问题。现总结如下: 1.查看僵尸进程命令 p...

Linux僵尸进程产生及如何避免

在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成...

linux 如何清理僵尸进程

今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程。 26327 ?        S      0:05  \_ /usr/bin/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux僵尸进程
举报原因:
原因补充:

(最多只允许输入30个字)