如何处理僵死进程

创建时间: 2017-09-04
最后修改时间: 2017-09-04

因个人水平有限,文章中存在不足,错误之处,还望指正

引言

在编程中常常会产生许多子进程,当子进程终止时如果不对其进行处理则会一直是僵死进程。如果系统中存在过多的将是进程的话,则会严重影响机器的性能。

下面将说明如何处理僵死进程。

父进程和子进程终止关系

父进程和子进程终止关系有两种:父进程先于子进程终止和子进程先于父进程终止。

  • 父进程先于子进程终止

终止进程的子进程的父进程更改为init进程,也就是父进程ID更改为1。

当一个进程终止时,内核会检查所有的活动进程,找出正要终止进程的子进程并将其父进程更改为init进程。

  • 子进程先于父进程终止

内核会为每个终止子进程保留一定量的信息,父进程就可以通过调用wait函数来获取这些信息。如果父进程没有调用wait函数的话,则该资源就会一直被占用。

僵死进程定义

一个已经终止、但父进程尚未对其进行善后处理(获取终止进程有关信息、释放它占用的资源)的进程被称为僵死进程(zombie)。

相关函数-wait函数

这里说的wait函数是指一系列的wait函数,包括wait、waitpid、waitid等等。

#include <sys/wait.h>

pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
返回值:若成功,返回进程ID;若出错,返回0或-1

调用wait或waitpid的进程将会发生:
- 如果所有子进程都还在运行,则阻塞。
- 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
- 如果没有任何子程序,则立即出错返回。

wait和waitpid函数的区别如下:
- 在一个子进程终止前,wait使调用者阻塞,而waitpid可设置选项使得调用者不阻塞。
- waitpid并不等待在其调用之后的第一个终止子进程,它可通过选项来设置等待的进程。

在waitpid函数中,参数pid的取值及意义如下:

pid==-1     等待任一子进程。此种情况下,waitpid等效于wait。
pid>0       等待进程ID为pid的子进程。
pid==0      等待调用者进程组内的任一子进程。
pid<-1      等待组ID等于|pid|的任一子进程。

参数options是以下各标志的按位或运算或为0。

常量            说明
WCONTINUED      等待一进城,它以前曾被停止,此后又继续,但状态尚未报告。
WEXITED         等待已退出的进程。
WNOHANG         如无可用的子进程退出状态,立即返回而非阻塞。
WNOWAIT         不破坏子进程退出状态。该子进程退出状态可由后续的wait、waitid或waitpid调用获取。
WSTOPPED        等待一进程,它已经停止,但其状态尚未报告。

处理方法

当一个进程正常或异常终止时,内核就会向其父进程递送SIGCHLD信号。利用这一点,我们可以在接收到SIGCHLD信号后调用wait函数,这样wait就会立即返回而不需要阻塞父进程。处理可以如下:


void sig_chld(int signo) 
{
    pid_t pid;
    int status;

    pid = wait(&status);

    ...

    return ;
}

但是,上面处理方法却有一个问题:信号一般是不排队的,当多个子进程终止时,可能SIGCHLD信号只被递送一次,这就留下了其他的僵死进程。所以在接收到SIGCHLD信号后要释放所有的僵死进程资源而不仅仅是其中的一个。


void sig_chld(int signo) 
{
    pid_t pid;
    int status;

    // 以非阻塞方式获取任一终止子进程的终止状态,也可以通过其他wait函数来执行相同操作
    while((pid = waitpid(-1, &status, WNOHANG)) > 0) {
        ...
    }
    return ;
}

参考

《UNIX环境高级编程》
《UNIX网络编程 卷1:套接字联网API》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值