1、wait的工作原理
(1)子进程结束时,系统向其父进程发送SIGCHILD信号
(2)父进程调用wait函数后阻塞
(3)父进程被SIGCHILD信号唤醒,然后去回收僵尸子进程
(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程
(5)若父进程没有任何子进程则wait返回错误。
2、参数解读
(1)wait的参数status。
status用来返回子进程结束时的状态,父进程通过wait得到status后就可以知道子进程的一些结束状态信息。
(2)wait的返回值pid_t。
这个返回值就是本次wait回收的子进程的PID。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。
(3)小结:wait主要是用来回收子进程资源,回收同时还可以得知被回收子进程的pid和退出状态。
(4)WIFEXITED、 WIFSIGNALED、 WEXITSTATUS这几个宏用来获取子进程的退出状态。
WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)。WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止)。WEXITSTATUS宏用来得到正常终止情况下的进程返回值。
3、fork后wait回收编程实例
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>int main(void){pid_t p1 = -1;pid_t ret = -1;int status = 0;p1 = fork();//返回2次if(p1 == 0){//这里一定是子进程printf("子进程,pid = %d.\n", getpid());}else if(p1 > 0){//这里一定是父进程printf("parent.\n");ret = wait(&status);printf("子进程已经被回收,子进程pid = %d.\n", ret);printf("子进程是否被正常回收: %d.\n", WIFEXITED(status));}else {//这里一定是fork出错了perror("fork");return -1;} return 0;}
4、wait和waitpd差别
(1)基本功能一样,都是用来回收子进程的
(2)waitpid可以回收指定PID的子进程
(3)waitpid可以阻塞或者非阻塞两种工作模式。