linux 僵尸进程以及进程等待和退出码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40921797/article/details/82018087

什么是僵尸进程

子进程先于父进程退出,子进程退出为了保存自己的退出状态,因此这个退出后资源不会被完全释放,而是等待父进程来获取一个退出状态,然后释放子进程所有资源。可是,这时假如,父进程并不关心子进程的退出状态,那么这时候这个退出进程将成为一个僵尸进程,占据着系统资源而不释放。

什么是孤儿进程

父进程先于子进程退出,于是子进程成为孤儿进程,被送给 1 进程代为管理,子进程此时在后台运行。

为什么要进程等待

进程等待的出现,就是为了避免子进程先行退出变成僵尸进程,占据资源。系统中有一个可以结束进程运行的命令kill +id号,以及kill -9 +id号强制杀死结束进程 命令都不能够结束僵尸进程。所以我们要尽可能避免僵尸进程的出现。

什么是进程等待

pid_t waitint *status);//阻塞式进程等待

pid_t waitpid(pid_t pid,int * status,int options);//非阻塞式进程等待

wait
等待任意子进程退出,是阻塞式等待,如果没有子进程退出就一直等待。必须等到有一个子进程退出后获取退出状态,释放资源才返回。返回值>0则等待成功,失败返回-1会报错。
waitpid
非阻塞等待,指的是它并不是时时等待,而是每隔一段时间访问一次状态,是否退出。
举个例子,有的黄包车车夫是一直在你家门口等你出门,你不出门他就一直等你,这就是wait。如果你就不出去了,他就等待失败了,一天没赚到钱。而有的黄包车车夫则是一会来你家门口转一圈,一会路过一下你家门口。不去的间隙还可以干点别的事,这就是waitpid。
1.第一个参数是指,指定等待哪个进程返回,退出时返回id,没有退出返回0,返回失败返回-1,当第一个参数pid=-1时,则表示等待任意子进程退出,效果等同于wait。
2.第二个参数status就用与接受子进程的退出状态,如果不关心子进程的退出状态,则可第二个参数传递NULL。
3.第三个参数默认为0,则当第一个参数为-1时,options参数要设置为0,option是选项参数,也就是受waitpid还提供了一些额外的选项来辅助等待,列举两个:
WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待,并立即报错。若已结束,则返回该子进程的ID。
WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。

status

status用于获取子进程的退出状态,虽然给我们的参数类型,他好像是int 整型,但是实际上它可不是单纯的整形。
status 有4个字节存储,实际上它只用了底16位,及低位的两个资金存储退出信息。
当正常退出时:底16位中的较高的8位存储退出状态,底8位全部为0。这里高八位存储的退出码,必须运行完毕正常退出才会有
这里写图片描述
当被信号终止退出时:如被kill结束时高8位空闲不用,从0位开始数的第7位中存储标志退出的退出码,底7位存储终止信号值。
这里写图片描述

获取退出码

正常退出:
status >> 8 //右移8位,则可获取第16中的高八位
WEXITSTATUS(status);//这时系统库给出的宏定义,和上式等价
信号杀死:
status & 0x7f //获取第7位
WIFEXITED(status);//同为宏定义和上式等价。

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/82018087