wait 函数
函数原型
#include <sys/types.h>
#include <wait.h>
int wait(int *status)
返回值
成功:清理掉的子进程ID;失败:-1 (没有子进程)
函数功能
父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
① 阻塞等待子进程退出
② 回收子进程残留资源
③ 获取子进程结束状态(退出原因)。
可使用wait函数传出参数status来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。宏函数可分为如下三组:
1. WIFEXITED(status) 为非0 → 进程正常结束
WEXITSTATUS(status) 如上宏为真,使用此宏 → 获取进程退出状态 (exit的参数)
2. WIFSIGNALED(status) 为非0 → 进程异常终止
WTERMSIG(status) 如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。
*3. WIFSTOPPED(status) 为非0 → 进程处于暂停状态
WSTOPSIG(status) 如上宏为真,使用此宏 → 取得使进程暂停的那个信号的编号。
WIFCONTINUED(status) 为真 → 进程暂停后已经继续运行
注意:一次wait或waitpid调用只能清理一个子进程,清理多个子进程应使用循环。
waitpid函数
函数原型
pid_t waitpid(pid_t pid, int *status, in options);
参数pid:
> 0 回收指定ID的子进程
-1 回收任意子进程(相当于wait)
0 回收和当前调用waitpid一个组的所有子进程
< -1 回收指定进程组内的任意子进程
参数 status:子进程的退出状态,用法同wait函数
参数options:
设为WNOHANG:非阻塞
设为0:阻塞
返回值
>0:清理掉的子进程
-1:无子进程
=0:参数3为WNOHANG,子进程正在运行
功能
作用同wait,但可指定pid进程清理,可以不阻塞。