🪐🪐🪐欢迎来到程序员餐厅💫💫💫
主厨的主页:Chef‘s blog
所属专栏:青果大战linux
我有一个朋友,拿了个国二,还找了个小学妹,被上压力了啦,
我们在上一篇进程退出码提到了退出码,但其实他的相关知识还有一半没讲,因为这个要结合进程阻塞才可以。
进程等待
我们在讲进程状态时就提到了,当子进程结束,如果父进程不对子进程进行回收,那 子进程就会一直处于僵尸状态,现在我们就要开始讲父进程是如何对子进程进行回收的了。
进程回收的必要性
- 子进程结束后,如果不回收,就会进入僵尸状态,那么他的一部分内存就无法回收,造成内存泄漏,即便是kill命令也不行,因为你无法杀死一个死掉的进程
- 子进程结束后,父进程需要知道子进程是否完成任务,如果失败了,失败原因是什么,这些可以通过回收进程来获取相关信息。
wait函数
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);
函数返回值
- 成功:返回被终止子进程的进程ID
- 失败:返回 -1
我愿称之为最朴实无华的回收函数
#include<stdio.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<unistd.h>
int main(){
pid_t p=fork();
if(p>0){
pid_t k=wait(NULL);
if(k<0)
printf("回收失败了\n");
else
printf("回收成功了\n");
while(1){
sleep(1);
printf("我是父进程%d\n",getpid());
}
}
else if(p==0)
{
int cnt=5;
while(cnt--)
{
printf("我是子进程:%d 我还在运行\n",getpid());
sleep(1);
}
}
}
可以看出,wait确实回收了子进程,子进程在结束后不再像之前一样以僵尸状态继续保留 ,而是立刻消失了
但是wait的功能实在是太少了&