浅谈Linux进程等待

本文深入解析进程等待机制,探讨僵尸进程与内存泄漏的关系,对比wait与waitpid方法,阐述阻塞与非阻塞等待的区别,提供代码实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程等待的必要性

子进程退出,父进程不管不顾,就可能造成 僵尸进程 的问题,进而造成内存泄漏

另外,进程一旦变成僵尸状态,kill -9也无能为力,因为谁也没有办法杀死一个死去的进程

最后,父进程派给子进程的任务完成的如何,我们需要知道

父进程通过进程等待的方式,回收子进程资源,避免内存泄漏,获取子进程退出信息

进程等待的方法

wait方法

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int * status);

返回值:成功返回被等待进程的pid,失败返回-1.

参数:输出型参数,获取子进程退出状态,不关心则可以设置为NULL

注意:这种等待方式是阻塞式等待 ,也就是说如果父进程调用了wait函数,那么父进程啥都不干了自己的代码不跑了就坐在那等退出的子进程,目前要是没有要退出的子进程,,父进程就一直等着,這就是阻塞式等待;那么如果有子进程退出了,那么就获取推出状态返回。当然,如果父进程是收到了SIGCHLD信号,那么它肯定是立马调wait立马返回然后立马清理然后没了,我们在任意时刻调用wait必定很可能是会阻塞的。

waitpid方法

pid_t waitpid(pid_t pid,int *status,int options);

返回值:当正常返回的时候waitpid返回收集到的子进程的进程ID

              如果设置了选项WNOHANG,而调用中waitpid发现自己没有已退出的子进程可收集,则返回;

              如果调用中出错,则返回-1,这是errno会被设置成相应的值以指示错误所在;

参数:

 pid:

  pid=-1,等待一个子进程,与wait无效

  pid>0, 等待其进程ID与PID相等的子进程

status:

  WIFEXITED(status):若为正常终止子进程返回的状态,则为真。(查看进程是否正常退出)

  WEXITSTATUS(status):若WIFEXITED非零,提取子进程的退出码(查看进程的退出码)

  options:

  WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待,若正常结束,则返回该子进程的ID

waitpid是等待指定的子进程退出,而wait是等到谁就是谁,wait在等待的时候就是阻塞,而waitpid如果等不到就立马返回继续干自己的事情,是一种非阻塞式等待

注意

如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程的退出信息

如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞

如果不存在该子进程,则立即返回出错

具体代码实现

进程的阻塞等待方式

运行结果如下:

进程的非阻塞等待方式

代码实现

代码中do while循坏里叫做轮询(定期循环的检测等待的措施是否准备就绪(一定要基于非阻塞式调用)

运行结果如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值