wait函数
父进程调用wait 函数可以回收子进程终止信息。该函数有三个功能:
① 阻塞等待子进程退出
② 回收子进程残留资源
③ 获取子进程结束状态(退出原因)。
pid_t wait(int *status); 成功:清理掉的子进程 ID;失败:-1 (没有子进程)
当进程终止时,操作系统的隐式回收机制会:1.关闭所有文件描述符 2. 释放用户空间分配的内存。内核的 PCB 仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号) 1. WIFEXITED(status) 为非0 → 进程正常结束。
常用相关函数:
- WIFEXITED(status) 为非0 → 进程正常结束
WEXITSTATUS(status) 如上宏为真,使用此宏 → 获取进程退出状态 (exit 的参数) - WIFSIGNALED(status) 为非0 → 进程异常终止
WTERMSIG(status) 如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。
waitpid函数
作用同wait,但可指定 pid 进程清理,可以不阻塞。
pid_t waitpid(pid_t pid, int *status, in options); 成功:返回清理掉的子进程 ID;失败:-1(无子进程)
参数
- pid:
- 大于0 回收指定ID 的子进程
- -1 回收任意子进程(相当于wait)
- 0 回收和当前调用waitpid 一个组的所有子进程
- < -1 回收指定进程组内的任意子进程
- status:(传出)回收进程的状态
- options:WNOHANG指定回收方式为:非阻塞。为0,则阻塞。
返回值:
- 如果>0表示回收的子进程的pid
- -1 回收失败。会设置errno
- 0 参3 为 WNOHANG,且子进程正在运行,回收不成功。
wpid = waitpid(-1, NULL, WNOHANG);//回收任意子进程,若没有结束的子进程,父进程直接返回0
wpid = waitpid(pid, NULL, WNOHANG);//回收指定的一个子进程
wait、waitpid 依次调用只回收一个子进程,如果想回收多个子进程,需要用循环