当父进程通过fork创建了子进程之后, 父进程和子进程的执行顺序是无法控制的. 如果想控制, 有两种办法: 使用vfork创建或者父进程调用等待函数wait.
关于fork和vfork的区别, 请参考APUE, 以后也我也会写相关的文章具体解释.
这篇文章主要介绍wait和类似的waitpid调用.
1. 当进程终止时, 会向其父进程发送SIGCHLD信号, 这个异步事件可以在父进程运行的任何时候发生, 包括正常和异常终止两种. 调用wait和waitpid的进程可能会有以下三种情况:
#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:
options:
这个一参数可以让我们进一步控制waitpid的操作, 此参数或者是0, 或者是下列的逐位或常数之一:
WNOHANG: 若由pid指定的子进程并不立即可用, 则waitpid不阻塞, 此时其返回值为0.
WUNTRACED: 若某实现支持作业控制, 则由pid指定的任一子进程状态已暂停, 且其状态自暂停以来还 未报告过, 则返回其状态. WIFSTOPPED宏确定返回值是否对应于一个暂停子进程.
3. waitpid和wait的区别:
waitpid提供了wait函数不能实现的3个功能:
4. 用于检查wait和waitpid两个函数返回终止状态的宏:
这两个函数返回的子进程状态都保存在statloc指针中, 用以下3个宏可以检查该状态:
具体实例代码请参考APUE.
关于fork和vfork的区别, 请参考APUE, 以后也我也会写相关的文章具体解释.
这篇文章主要介绍wait和类似的waitpid调用.
1. 当进程终止时, 会向其父进程发送SIGCHLD信号, 这个异步事件可以在父进程运行的任何时候发生, 包括正常和异常终止两种. 调用wait和waitpid的进程可能会有以下三种情况:
- 阻塞(如果其所有的子进程都还在运行)
- 带子进程的终止状态正常返回(其中一个子进程终止)
- 出错返回(没有子进程)
#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绝对值的任一子进程.
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.