linux 中的 wait 函数和 waitpid 函数

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进程清理,可以不阻塞。

原文地址:https://www.cnblogs.com/xumaomao/p/13061264.html