进程环境与进程控制(3): 等待子进程wait/waitpid

当父进程通过fork创建了子进程之后, 父进程和子进程的执行顺序是无法控制的. 如果想控制, 有两种办法: 使用vfork创建或者父进程调用等待函数wait.
关于fork和vfork的区别, 请参考APUE, 以后也我也会写相关的文章具体解释.
这篇文章主要介绍wait和类似的waitpid调用.

1. 当进程终止时, 会向其父进程发送SIGCHLD信号, 这个异步事件可以在父进程运行的任何时候发生, 包括正常和异常终止两种. 调用wait和waitpid的进程可能会有以下三种情况:
  1. 阻塞(如果其所有的子进程都还在运行)
  2. 带子进程的终止状态正常返回(其中一个子进程终止)
  3. 出错返回(没有子进程)
原型如下:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *statloc);
函数返回: 若成功则为进程ID,若出错则为-1.
参数说明:
statloc: 如果是不是空指针, 则子进程的返回状态保存在该指针指向的整型变量中; 如果是空指针, 则忽             略返回状态.



2. waitpid函数:
如果一个进程有若干个子进程, 那么只要有一个子进程返回, wait就返回. 如果要等待一个指定的子进程, 有两种方法. 第一个种, 早期的UNIX必须调用wait, 然后把返回的pid和期望pid做比较, 如果不是期望的, 把该pid保存起来, 继续调用wait, 直到进程终止. 第二种是使用waitpid.
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);

函数返回: 若成功则为进程ID, 若出错则为-1.
参数说明:
pid:
  • pid == -1 等待任一子进程. 这个时候waitpid与wait等效.
  • pid > 0     等待其ID与pid相等的子进程.
  • pid == 0  等待其组ID与调用进程的组ID的任一子进程.
  • pid < -1    等待其组ID等于pid绝对值的任一子进程.
对于waitpid函数, 如果指定的进程或进程组不存在, 或者调用进程没有子进程都会出错.

options:
这个一参数可以让我们进一步控制waitpid的操作, 此参数或者是0, 或者是下列的逐位或常数之一:
WNOHANG: 若由pid指定的子进程并不立即可用, 则waitpid不阻塞, 此时其返回值为0.
WUNTRACED: 若某实现支持作业控制, 则由pid指定的任一子进程状态已暂停, 且其状态自暂停以来还                       未报告过, 则返回其状态. WIFSTOPPED宏确定返回值是否对应于一个暂停子进程.

3. waitpid和wait的区别:
waitpid提供了wait函数不能实现的3个功能:
  • waitpid等待特定的子进程, 而wait则返回任一终止状态的子进程;
  • waitpid提供了一个wait的非阻塞版本;
  • waitpid支持作业控制(以WUNTRACED选项).

4. 用于检查wait和waitpid两个函数返回终止状态的宏:
这两个函数返回的子进程状态都保存在statloc指针中, 用以下3个宏可以检查该状态:
  • WIFEXITED(status): 若为正常终止, 则为真. 此时可执行
    • WEXITSTATUS(status): 取子进程传送给exit或_exit参数的低8位.
  • WIFSIGNALED(status): 若为异常终止, 则为真. 此时可执行
    • WTERMSIG(status):  取使子进程终止的信号编号.
  • WIFSTOPPED(status): 若为当前暂停子进程, 则为真. 此时可执行
    • WSTOPSIG(status): 取使子进程暂停的信号编号.

具体实例代码请参考APUE.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值