wait()函数是Linux/Unix系统里的一个系统级函数,在C语言中通过#include <sys/wait.h>包含该系统调用的头文件。
想要查看如何使用这个函数,可以在终端中输入:
man 2 wait
如下图:
wait系统调用可以让父线程阻塞等待子线程的终止,并且可以获取子线程的终止状态信息。
下面举例说明如何使用它。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid = fork();
if(pid < 0)
{
perror("fork");
exit(1);
}
if(pid == 0)
{
int n = 3;
while(n > 0)
{
printf("this is child process, pid[%d]\n", getpid());
sleep(5);
--n;
}
exit(3);
}
else
{
int stat_val;
waitpid(pid, &stat_val, 0);
if (WIFEXITED(stat_val))
{
printf("Chiled exit with code %d\n", WEXITSTATUS(stat_val));
}
else if (WIFSIGNALED(stat_val))
{
printf("Child terminated abnormally, signal[%d]\n", WTERMSIG(stat_val));
}
}
return 0;
}
程序正常的输出是:
zhanghaodeMacBook-Pro:cpp_excise zhanghao$ g+./a.out
this is child process, pid[12960]
this is child process, pid[12960]
this is child process, pid[12960]
Chiled exit with code 3
如果执行过程中,再起一个终端,把子进程杀死,如下:
kill -9 12788 //子进程ID每次会变,可以直接从打印看出来,或者通过ps u查当前用户进程
则会走到异常情况,此时后台的打印会是这样:
zhanghaodeMacBook-Pro:cpp_excise zhanghao$ ./a.out
this is child process, pid[12788]
this is child process, pid[12788] //此时在另一个终端敲了kill -9 12788
Child terminated abnormally, signal[9]