wait回收子进程
函数原型
int status;
pid wait(&status);
功能
- 阻塞等待子进程
- 回收子进程资源
- 返回子进程结束状态
参数
status为传出参数,保存子进程结束的信息(结束的原因,例如正常结束、异常中断…)
返回值
回收成功返回进程pid,失败返回-1
关于wait函数的补充
有以下几个宏函数
- int WIFEXITED(int status)若返回值非0,即正常退出
WEXITSTATUS(int status)若上函数非0,即子进程正常结束–>获取进程退出状态(exit的参数) - int WIFSIGNALED(int status) 若返回值非0,即异常退出
WTERMSIG(int status) 若上函数非0,即子进程异常退出–>获取异常退出状态(kill -l可以查看到所有中断状态) - WSTOPPED(int status)若返回值非0,即进程处于暂停状态
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid,wpid;
int status;
pid = fork();
if(pid==0){
printf("----child, my parent = %d, going to sleep\n",getppid());
sleep(10);
printf("--------child die---------------\n");
}else if(pid>0){
//sleep(2);
wpid=wait(&status);
if(wpid==-1){
perror("wait error:");
exit(1);
}else{
if(WIFEXITED(status)) printf("child exits with:%d\n",WEXITSTATUS(status));
if(WIFSIGNALED(status)) printf("child was killed with:%d\n", WTERMSIG(status));
}
printf("I'm parent, my pid =%d\n",getpid());
}
return 0;
}
waitpid函数
函数原型
waitpid(int pid, int status, int option)
参数
- pid:> 0,指定pid回收
= -1,回收任意子进程
= 0,回收本组任意子进程
< -1,回收该进程组的任意子进程 - status:同wait函数
- option:= 0,阻塞回收(跟wait一样)
WNOHANG,非阻塞回收
返回值
回收成功返回pid,失败-1
option为WNOHANG,且子进程未结束时返回0