linux 识别僵尸进程,linux下僵尸进程(Defunct进程)的产生与避免

在测试基于 DirectFB+Gstreamer 的视频联播系统的一个 Demo 的时候,其中大量使用 system 调用的语句,例如在 menu 代码中的 system("./play") ,并且屡次执行,这种状况下,在 ps -ef 列表中出现了大量的 defunct 进程,对程序的运行时有害的。按说system的源码中应该已经包含了wait,但也不能排除开发板上这个版本的system中可能没有wait,总之,开发板上在调用system后添加wait以后,defunct进程不复存在了。网络

下面谈谈 defunct 进程,中文翻译叫僵尸进程。下文整理于网络以及APUE一书。异步

1、什么是僵尸进程函数

在UNIX 系统中,一个进程结束了,可是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。当用ps命令观察进程的执行状态时,看到这些进程的状态栏为defunct。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。性能

可是若是该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。由于每一个进程结束的时候,系统都会扫描当前系统中所运行的全部进程,看看有没有哪一个进程是刚刚结束的这个进程的子进程,若是是的话,就由Init进程来接管他,成为他的父进程,从而保证每一个进程都会有一个父进程。而Init进程会自动wait其子进程,所以被Init接管的全部进程都不会变成僵尸进程。测试

2、UNIX下进程的运做方式spa

每一个Unix进程在进程表里都有一个进入点(entry),核心进程执行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用创建一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,而后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。翻译

子进程的结束和父进程的运行是一个异步过程,即父进程永远没法预测子进程到底何时结束。那么会不会由于父进程太忙来不及 wait 子进程,或者说不知道子进程何时结束,而丢失子进程结束时的状态信息呢?设计

不会。由于UNIX提供了一种机制能够保证,只要父进程想知道子进程结束时的状态信息,就能够获得。这种机制就是:当子进程走完了本身的生命周期后,它会执行exit()系统调用,内核释放该进程全部的资源,包括打开的文件,占用的内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值