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]