wait, waitpid, waitid - wait for process to change state
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
//Both return: process ID if OK, 0 (see later), or -1 on error
wait和waitpid区别
wait
会阻塞直到子进程中止。waitpid
能有option
能防止阻塞waitpid
不等待第一个中止的child
process,有相应option
控制等待哪个进程
status
如果不是NULL
指针,返回的状态保存在里面
sys/wait.h 定义了如下macro(宏)查看中止状态
参数pid的四种value
- pid = -1, 等待任何子进程。在这种情况下
waitpid
等于wait
- pid > 0, 等待进程ID等于
pid
的子进程 - pid == 0, 等待任何进程组ID等于调用进程的(process group id)的进程
- pid < -1, 等待任何进程组ID(process group id)等于
pid
绝对值的子进程
wait的注意点
- 真正的错误是调用者用没子进程
- 其余的错误返回是因为
signal
中断
waitpid的注意点
- 返回值是中止的子进程的
进程ID
- 中止状态保存在
status
指向的参数里。 - 产生错误可能是因为指定的进程和进程组不存在,或者不是调用者的子进程
waitpid的options参数的作用
waitpid提供了三个wait不具备的特性
- waitpid是我们等待一个特定的进程
- waitpid提供了无阻塞版本的
wait
waitpid
使用WUNTRACED
和WCONTINUED
选项来支持job control
waitid
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
//Returns: 0 if OK, -1 on error
特点:
- 和waitpid一样允许等待指定的子进程
- 将
process ID
和process group ID
使用了分离的参数,而不是像waitpid和wait一样合成为一个参数。
参数说明
id参数的含义取决于idtype
idtype
如下
options决定调用者关心那些状态的改变
infop是结构体siginfo的指针
该结构体包含了在子进程造成状态改变的信号的详细信息