文章目录
转自http://www.bubuko.com/infodetail-2752650.html
wait() 函数:
进程调用 exit() 退出执行后,被设置为僵死状态,这时父进程可以通过 wait4() 系统调用查询子进程是否终结,之后再进行最后的操作,彻底删除进程所占用的内存资源。 wait4() 系统调用由 linux 内核实现,linux 系统通常提供了 wait()、waitpid()、wait3()、wait4() 这四个函数,四个函数的参数不同,语义也有细微的差别,但是都返回关于终止进程的状态信息。
wait() 函数的原型是:
#include <sys/types.h> // 提供类型 pid_t 的定义
#include <sys/wait.h>
pid_t wait(int *status);
当进程调用 wait() 时,会暂停目前进程的执行(即阻塞),由 wait() 来自动分析是否当前进程的某个子进程已经退出,如果找到了这样一个已经变成僵尸进程的子进程,wait 就会收集这个子进程的信息,并将其彻底销毁后返回;如果没有找到这样一个子进程,wait 就会一直阻塞在这里,直到出现僵尸进程。
参数 status 保存着子进程退出时的一些状态(包括 task_struct、thread_info及内核栈等)它是一个指向 int 类型的指针;如果不在意子进程的结束状态值,只想把这个僵尸进程消灭掉(实际上,大多数时候都是这样做的),则可以将这个参数设为 NULL,即:
pid = wait(NULL); // 不管子进程的结束状态,直接杀死进程
如果 wait() 调用成功,则会返回被收集子进程的进程ID;如果被调用进程没有子进程,则调用失败,返回 -1
接下来用一段代码来演示一下 wait() 的用法:
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6
7 void main(){
8 pid_t fpid,rpid;
9 fpid = fork();
10 if(fpid < 0){
11 perror("error on forking!\n");
12 }
13 else if(fpid == 0){
14 printf("this is a child process! the pid is %d\n",getpid());
15 sleep(3);
16 }
17 else{
18 rpid = wait(NULL); // 如果 wait()调用成功,则返回子进程的PID;如果调用失败,则返回 -1
19 printf("Catch the child process with pid of %d\n",rpid);
20 }
21 exit(0);
22 }
输出结果如下:
关于 status 参数,比较复杂,暂时不做讨论,可以参考这里: https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part3/index.html