- 进程退出时需要把它的退出状态返回父进程。
父进程调用了 wait() 函数之后,就会一直等待子进程的退出;子进程退出后,父进程也是通过 wait() 函数来获取子进程的退出状态。
头文件
#include<sys/wait.h>
函数原型
pid_t wait(int *status)
//status就是用来间接记录子进程的退出值的。
返回值:
- 执行成功:退出的子进程的pid
- 失败:-1
处理子进程退出状态值的宏
- WIFEXITED(status):若子进程正常退出,则该宏为正。
- WEXITSTATUS(status):若子进程正常退出,则该宏获取子进程的退出值。
测试程序1
#include<stdio.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t res;
int status;
res = fork();
if(-1 == res)
{
printf("error!\n");
}
else if(0 == res)
{
printf("son\n");
exit(0);
}
else
{
wait(&status);
//父进程调用wait()之后,接下来的代码不会被执行,一直等到
//它的子进程(也就是上面的分支)退出后,才会继续执行。
if(1 == WIFEXITED(status))
{
printf("exit value:%d\n",WEXITSTATUS(status));
}
return 0;
}
}
编译、执行结果
jl@jl-virtual-machine:~/test$
jl@jl-virtual-machine:~/test$ gcc wait.c
jl@jl-virtual-machine:~/test$ ./a.out
son
exit value:0
jl@jl-virtual-machine:~/test$
如果你把子进程的退出值设置为任意值,如 exit(123),那么父进程获取并打印的值就是123。
一般很少在主函数中调用 wait() 来获取子进程的返回值,这样会造成阻塞。常用的方法是在子进程返回时向main发送信号,并传递值。