什么是僵尸进程?怎么处理?
僵尸进程(僵死进程)是指一个进程主体结束,但是该进程的PCB依旧存在的情况或者在多进程编程中,父进程未结束但是子进程已经结束父进程没有对子进程进行回收。
僵尸进程存在的意义在于进程结束后,进程的退出状态需要保存到PCB结构中,方便父进程获取子进程的退出状态。
进程真正结束的标志:1、进程主体退出。2、父进程获取子进程的退出状态之后,子进程的PCB释放。
那么我们为什么要处理掉僵尸进程呢,这是因为子进程结束完毕之后,别的空间都释放掉了,但是记录子进程的PCB还存在,长此以往,大量的PCB占用空间,就会造成空间浪费,甚至造成内存不足,所以在子进程结束后我们要将它彻底清除掉。我们可以考虑在当子进程结束时,通知父进程来处理这个结束的子进程。那么父进程是如何获取子进程的退出状态来处理该进程呢?
这就要用到wait函数来为子进程“收尸了”。
wait()的函数原型是:
#include
#include
pid_t wait(int *status)
父进程一旦调用了wait函数,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait()就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
wait()函数的参数:
参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,我们就可以设定这个参数为NULL,就象下面这样:
pid = wait(NULL);
但是这个时候我们就又遇到了一个问题:如果子进程无限循环或者运行时间需要很久,那么调用wait函数,我们岂不是要浪费很大的时间,所以我们就在想,能不能同时运行父子进程,当子进程结束后以一种特定的方式通知父进程。这种方式就相当于子进程结束后给父进程发送一个信号,父进程接收到信号后停下来,来处理信号所对应的函数,处理完之后在回来继续运行,我们就可以在信号对应的函数中将子进程结束掉。
所以我们要用到SIGCHLD信号处理函数,原型为
signal(int SIGCHLD,void (*fun)(int))
可以在fun函数里实现接收到子进程结束信号后子进程的结束。即给信号绑定一个信号处理函数,当进程接收到信号后,回调信号处理函数。这样在处理僵尸进程的过程中就不用花费大量时间等待了。
声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
-
西门子EDA对话清华大学周祖成教授,回顾双方数十年合作历程,提出关于培养中国集成电路设计人才的深刻见解,并分享他对于EDA行业机遇与挑战的洞见。 想了解清华大学与西门子EDA多年合作的幕后故事吗?
-
Numpy在python中属于非常常用的包,无论是机器学习搭配pandas,还是数据可视化搭配pylab都是很正常的搭配。 Numpy numpy的官方中文文档:NumPy...
-
实例 我以自己曾经写的一段实际代码为例,来讲解究竟该怎么进行GDB调试。 实例地址: GitHub:https://github.com/yngzMiao/protobuf-parser-tool...
-
新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程。...
-
如果你将面试一份C/C++的工作,那么无论是笔试题或者面试题都有极大可能会被问到getMemory()的问题。当然这也是一道比较纠结的题目,本文就对这几...
-
排序基本上属于算法里面必须要掌握的一块了,也是各家面试的重点考察的部分之一。 所谓内部排序,就是参与排序的数据都存储在内存中。分析排序算法的性能,一般从算法的时间复杂度、空间复杂度和稳定性三个方面着手...
-
最近,因为项目需要在STM32F103系列处理器上,对采集的音频信号进行FFT运算,然而STM32F103毕竟不是STM32F4系列的处理器,对于一般的FFT运算程序...
-
在Java Web中,将内容导出到Excel文档的方式有很多,本文主要介绍以POI的方式来进行导出。 情景:浏览器页面上显示有“本地下载”的超链接,点击超链接——后台查询数据库,将数据库的内容保存到Excel中——浏览器弹出下载...
-
Qt提供了与数据库联动以开发应用程序的模块。与其他API相比,Qt提供的API更直观,也更容易理解。使用Qt提供的API之前,需要添加如下的头文件。 #include <QtSql> 为使用Qt开发应用程序,与使用C++语言类似,数...
-
物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。 ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢? 因为ESP8266模...
-
1、矩阵式键盘的结构与工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一...
-
在Linux系统中,除了系统启动之后的第一个进程由系统来创建,其余的进程都必须由已存在的进程来创建,新创建的进程叫做子进程,而创建子进程的进程叫做父进程。那个在系统启动及完成初始化之后,Linux自动创建的进程...
-
Linux的虚拟文件系统与实际文件系统的关系如下所示: VFS的原理 各种文件系统之所以有区别,就在于它们的目录文件结构各不相同,随之而来的也就是对文件目录的操作函数也不相同。对于前者可以在保留原系统目录结...