一.进程等待的意义
1.不等待会有僵尸问题,此时僵尸进程无法被kill杀死,也无法进行资源回收,甚至有可能造成资源泄露。
2.父进程只是让子进程执行某个任务,执行结果如何父进程不知道
进程等待意义:回收资源并获取子进程执行信息
二.wait与waitpid
1.头文件与函数参数
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int* status);
pid_t waitpid(pid_t pid,int* status,int options);
waitpid函数参数及返回值含义:
(1)参数1:pid_t pid
等待的进程标识符号
-1表示等待任意进程
(2)参数2:int* status
详见进程终止进程终止(错误码与终止信号)-CSDN博客
status是输出型参数:0~7bit位表示终止信号 8~15bit位表示错误码
(3)参数3:int options
进程等待方式:
0:阻塞等待
WNOHANG:非阻塞等待
(4)进程返回值pid_t含义
返回值>0:进程等待成功,回收子进程资源成功,返回子进程的pid
返回值==0:WNOHANG时才会返回0,子进程访问成功,但是子进程没有结束
返回值<0:进程等待失败,例如参数1:pid_t pid填错填写了一个不存在的子进程
2.阻塞等待
waitpid死等子进程,子进程不结束,父进程就一直等着
int status
pid_t rid = waitpid(-1,&status,0);
printf("haha\n");
子进程不结束,waitpid就不会结束,haha就不会打印
3.非阻塞轮询等待
waitpid只查一下子进程状态,不死等
int status
while(1)
{
pid_t rid = waitpid(-1,&status,WNOHANG);
if(rid > 0)
{
//等待成功,子进程结束
break;
}
else if(rid == 0)//等待成功,子进程没结束
{
//等待成功
break;
}
else
{
//等待失败
break;
}
printf("haha\n");
}