尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux初学记第七章--僵死进程

Linux初学记第七章--僵死进程 什么是僵死进程?简单来说就是子进程先于父进程结束父进程没获取子进程的退出码。如何处理僵死进程就是让父进程通过调用wait()完成。示例一下面通过示例我们来更好地了解它。首先我在做的时候还出了一个小错误我们一起来看一下我本来是想将上节课的day829中的main.c拷贝到day95中这样我就不需要在写一遍但在拷贝时出现一个错误你可以发现是什么错误吗其实很明显了因为我在执行cp命令时已经进入day95文件夹里面了我当前位置是~/2510/day95而我写的day829/main.c是相对路径系统会去day95中的day829中的main.c找文件但事实是day95是新创建的里面没有day829所以会出错。前提插入:通过手册可以看一下在写wait()时要注意添加的两个头文件返回值类型都是pid_t。先改动一下代码在这里我只写了一个头文件因为linux系统中sys/wait.h内部间接包含了sys/types.h但不同的平台也许就不一样所以标准还是两个头文件。这个代码上一章有提到很详细的过程这一章只是略微改动一下因为我们是想要观察wait()阻塞等待回收子进程这一过程。这是运行后的结果。可看出父进程确实被堵塞住了子进程全部执行结束后wait函数才返回父进程才继续跑后面代码。我们此时看一下僵死进程是否被解决?注:这里打的ps(process status)是为了查看当前系统里有哪些进程打印进程PID、状态、命令。我们可以看出第一张图片PID是2133 2134而到了第2张图片是只剩下了21332134已经不见了说明我们解决掉了僵死进程。若果没有wait回收子进程肉体死掉但是PCB进程控制块还留在系统中就会变成僵死进程(僵尸进程)ps命令依然能看到这个2134号进程那就应该要被标记为defunct占据系统资源但现在我们让父进程调用了wait回收子进程的PCB把子进程的系统资源彻底释放还给操作系统。这里主播突然觉得人家给起的僵尸进程名字确实起的妙啊。在这里还有一个小注意的点有些人可能会疑问为什么这里val512wait(val);这里面的val是用来保存子进程退出的状态信息但它不单是存储退出码这一个数字还会有别的信息整个int整数多个比特位分工就会不同这里它是2被放在val的高8位所以就是2✖256512。如果你想拿到退出数字2可以通过man wait查看。孤儿进程父进程先结束了子进程就会变成孤儿进程系统会派一个新进程来接管并且一定会获取子进程的退出码这样就不会变成僵死进程了。示例二我们再将代码修改一下:我们现在让子进程运行7次后台执行:通过这个代码我们可以看出第一轮的时候还存在着父进程与子进程但第二轮ps时已经只剩下子进程了并且我们还观察到当它的父进程结束后我们子进程得到了一个新的父进程来接管它此时的ppid已经变为1427了。这告诉我们此时产生了孤儿进程并且孤儿进程会被系统进程收养孤儿进程也不会变成僵尸进程因为收养它的系统进程会自动调用wait帮它收回资源。
返回列表