Linux下回收子进程wait函数和waitpid函数的基本使用
1. 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程变为init进程 。
2. 僵尸进程:子进程终止了,父进程尚未回收子进程,子进程残留资源(PCB)存放于内核中,子进程变成僵尸(Zombie)进程。
问:那为什么子进程要把PCB残留在内核里呢?
答:因为子进程终止后,它会把终止信号等退出状态(不管正常终止还是异常终止都对应一个信号)保存在内核的PCB里面,只有这个子进程的父亲节调用wait或者waitpid获取这些退出状态,然后才会彻底清除掉这个子进程。如果父进程不调用wait或者waitpid,那么这个子进程就会成为僵尸进程。
问:什么方法可以清除掉一个僵尸进程。(附:kill命令清除不了僵尸进程的,因为kill命令只是用来终止进程的,而僵尸进程已经是终止的了)
答:kill确实是直接清除不掉僵尸进程,但是我们可以kill掉僵尸进程的父进程,这样僵尸进程的父进程就变为init进程,init进程自然会调用wait或者waitpid清除这个僵尸进程。
3. wait函数
pid_t wait(int *status); //status传出参数,存放子进程的退出状态信息
附:父进程一旦调用该函数,就会阻塞等待,直到子进程退出
返回值:成功返回子进程id,失败返回-1(无子进程) 。
status传出参数保存着子进程的退出状态,下面对其说明如下:
4. waitpid函数
pid_t waitpid(pid_t pid, int *status, int options);
功能:和wait一样,但是这个函数清除指定的pid,可以不阻塞父进程
返回值:成功返回清除掉的进程pid,失败返回-1 (无子进程) 。当options指定为WNOHANG时,返回0表示子进程正在运行。
下面对pid的不同取值情况的说明:
>0 表示回收指定ID的子进程
-1 表示回收任意子进程(相当于wait)
0 表示回收和当前调用waitpid一个组的所有子进程
<-1 表示回收指定进程组内的任意子进程,比如-6610表示回收进程组id为6610的任意子进程
附:一次wait或waitpid调用只能清理掉一个子进程,清理多个子进程应该使用循环调用多次 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库