僵死进程

一:基础概念

僵死进程:进程的PCB结构存在,进程主体释放,这种进程称为僵死进程。
一个进程使用fork创建子进程,子进程结束,父进程未获取子进程的退出码,从而子进程不得不保存退出码,所以整个PCB结构也就无法释放。
孤儿进程:一个父进程退出,它的一个或多个子进程还在运行,这些子进程被称为孤儿进程,孤儿进程会被进程init(进程号为1)接管,由init进程为它们完成状态收集工作。
在这里插入图片描述

二、问题与危害

        我们知道在Linux系统中,正常情况下,一个子进程是由父进程创建的。子进程的创建和父进程的运行时一个异步过程,父进程不知道子进程什么时候运行结束,当一个进程完成后,他的父进程需要调用wait或waitpid函数来获取子进程的退出状态。

        在Linux进程的状态中,僵尸进程是非常特殊的一种,它没有任何可执行代码,也不能被调度,仅仅在进程的列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集。除此之外,僵尸进程不再占有任何内存空间。
它需要他的父进程来为他收尸,如果他的父进程么有调用wait或waitpid等待子进程的结束,又没有显示忽略该信息,那么它就一直保持僵尸状态,如果这时候父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果父进程是一个循环,不会结束,那么子进程交一直保持僵尸状态,这就是为什么系统中有时会有很多僵尸进程。
        这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程,这就是僵尸进程的危害,应当避免。

三、wait和waitpid
#include <sys/types.h>//提供pid_t的定义
#include <sys/wait.h>
pid_t wait(int *reval);
  • 进程一旦调用了wait,就立即阻塞自己,如果让它找到了一个僵死的子进程,wait就会收集处理这个进程的信息并将它彻底销毁后返回;如果没有找到这样的进程,它就会一直阻塞运行,知道有一个僵死的进程出现为止(wait处理掉第一个结束的进程)。

        参数reval用来保存并收集退出进程的一些状态信息,是int类型的指针。因为我们对于进程是如何死掉的并不关心,只想要把僵死进程处理掉,就可以设定这个参数为NULL,例如 pid = wait(NULL);
        如果调用成功,wait返回被收集了的子进程的PID,如果进程没有子进程,调用失败返回-1.

#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *reval,int options);

参数:pid > 0,只等待进程PID等于pid的子进程,不管有多少其它子进程结束了,只要指定pid的子进程没结束,waitpid就一直等待下去;
pid = -1,等待任意一个子进程退出,和wait没有区别;
pid = 0,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid < -1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

options:提供了一些额外的参数来控制waitpid,Linux中支持WNOHANG(非阻塞),WUNTRACED两个选项
WNOHANG:如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
WUNTRACED:如果子进程进入暂停状态,则马上返回。

如果waitpid()函数执行成功,则返回子进程的进程号;如果有错误发生,则返回-1,并且将失败的原因存放在errno变量中。
失败的原因主要有:没有子进程(errno设置为ECHILD),调用被某个信号中断(errno设置为EINTR)或选项参数无效(errno设置为EINVAL)

  • waitpid(-1,NULL,0);
    这样调度waitpid就完全退化成了wait函数。
    wait函数就是经过包装了的waitpid函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值