解决僵尸进程的两种方式(重温waitpid函数、了解17号信号SIGCHLD)

本文介绍了如何通过waitpid函数和SIGCHLD信号解决子进程僵尸问题,包括waitpid参数的用法、子进程退出信号的理解,以及使用SIGCHLD信号处理函数和设置SIG_IGN的两种方式,确保资源的有效回收。

僵尸进程就是父进程创建了一个子进程,但是子进程退出以后,父进程在忙着干自己的事,没有回收子进程,导致子进程一直占用内存资源,这种情况我们称之为僵尸进程。

第一种方式,使用waitpid函数让父进程停下来等待子进程退出,并回收子进程,此时就能解决僵尸进程。在学习了进程信号以后,就有了第二种方式,子进程在退出的时候,会给父进程发送一个SIGCHLD信号,这个时候我们可以使用处理信号的知识来解决这个问题。


目录

一、waitpid函数

1、 第一个参数:准备回收的子进程的pid

2、第二个参数:输出型参数,获取子进程的退出状态

3、 第三个参数:进程等待的方式

二、SIGCHLD信号(17号信号)

1、方式一:在信号处理函数中,使用wait回收进程

 2、方式二:设置信号处理方式为SIG_IGN(仅适用于Linux)


一、waitpid函数

下面是waitpid函数的声明以及需要用到的头文件,我们要重点介绍的是,这个函数的参数

1、 第一个参数:准备回收的子进程的pid

如果填入的是子进程的pid,那么就会等待回收指定进程的pid

waitpid(19989, ... , ...);    //等待进程pid为19989的子进程

如果填入的是 -1,那么就会等待回收所有进程

2、第二个参数:输出型参数,获取子进程的退出状态

int status;
waitpid(-1 , &status , ... );

status不能简单的当作整型来看,要从二进制的角度来看,子进程正常退出时,子进程返回的是退出码异常退出时,子进程返回的是一个中止信号。status以二进制的形式保存了这两样东西,保存在低16位,即0~15位,其中 0~6 保存中止信号,7 是core dump标志位,8~15是保存退出码

想要详细了解的可以看看下面博客中的 “关于status

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值