【Linux】僵尸进程|筛选输出|多进程与信号 学习笔记
日期:2025.1.29(凌晨)学习内容:
[*]僵尸进程
[*]筛选输出
[*]多进程与信号
个人总结:
僵尸进程:
首先我们需要先了解一件事情,我们在使用fork函数的时候可以使得当前的进程再创建出来一个子进程,这个子进程在大多数的时候会复制一份新的我们的内存地址,数据内存等。那么这个子进程所占有的资源如何释放呢?对于我们当前的进程占有的资源如何释放,我们显然知道,当return的时候,那么进程就应该结束了。但是子进程什么时候结束我们并不知道,所以这时候我们就需要一个可以帮助我们判断子进程是否结束的函数wait()函数。
[*]wait函数:参数是一个指针,这个指针代表的意义是存储子进程的退出状态。这个退出状态具体怎么判断我们还需要宏,WIFEXITED,WEXITSTATUS,WTERMSIG。(宏的参数都是int)第一个是用来判断子进程退出状态是否正常,第二个是用来记录退出状态正常时的退出状态码,第三个是用来记录退出状态异常时的退出状态码(信号的编号)。
[*]退出状态正常:使用return或者exit函数退出,返回的值就是退出状态码
[*]退出状态异常:使用信号来中断进程,返回的值其实也就是信号的编号
这里还有一个小的前提是,当我们知道一个进程什么时候结束,那么就可以交由操作系统来回收在其所消耗的资源。
所以我们使用wait函数便可以回收。
一般会有两种情况,一种是父进程先结束,子进程再结束,第二种是子进程先结束,父进程再结束。
前者:当父进程提前结束时,子进程会被pid=1的进程托管,成为其新的父进程。进程名为init。而init自带wait函数,可以回收利用。
后者:由于子进程先结束,假设父进程此刻没有wait函数,那么我们不知道子进程结束的时机,数据内存无法释放,进程编号也无法回收被一直占用,这种情况,便是僵尸进程。
兜兜转转绕了一大圈,但是解决办法我们也已经说完啦,接下来直接上代码。
#include #include #include #include using namespace std;int main(){ pid_t pid = fork(); if (pid > 0) { // wait(nullptr); int *status=new int; wait(status); if (WIFEXITED(*status)) { cout
页:
[1]