wait 系统调用
pid_t waitpid(pid_t pid, int *status, int options);
#include
系统调用wait的功能是发出调用的进程只要有子进程,就睡眠直到它们中的一个终止为止。该调用声明的格式如下:
pid_t wait(int *status)pid_t waitpid(pid_t pid, int *status, int options);
在使用这些系统调用的程序中要加入以下头文件
#include#include
发出wait调用的进程进入睡眠直到它的一个子进程退出时或收到一个不能被忽略的信号时被唤醒。如果调用发出时,已经有退出的子进程(这时子进程的状态是僵死状态),该调用立即返回。其中调用返回时参数status中包含子进程退出时的状态信息。
调用waitpid与调用wait的区别是waitpid等待由参数pid指定的子进程退出。其中参数pid的含义与取值方法如下:
- 参数pid < -1时,当退出的子进程满足下面条件时结束等待:该子进程的进程组ID(process group)等于绝对值的pid这个条件。
- 参数pid = 0时,等待任何满足下面条件的子进程退出:该子进程的进程组ID等于发出调用进程的进程组ID。
- 参数pid > 0时,等待进程ID等于参数pid的子进程退出。
- 参数pid = -1时,等待任何子进程退出,相当于调用wait。
对于调用waitpid中的参数options的取值及其含义如下:
- WNOHANG:该选项要求如果没有子进程退出就立即返回。
- WUNTRACED:对已经停止但未报告状态的子进程,该调用也从等待中返回和报告状态。如果status不是空,调用将使status指向该信息。下面的宏可以用来检查子进程的返回状态。前面三个用来判断退出的原因,后面三个是对应不同的原因返回状态值:
- WIFEXITED(status):如果进程通过系统调用_exit或函数调用exit正常退出,该宏的值为真。
- WIFSIGNALED(status):如果子进程由于得到的信号(signal)没有被捕捉而导致退出时,该宏的值为真。
- WIFSTOPPED(status):如果子进程没有终止,但停止了并可以重新执行时,该宏返回真。这种情况仅出现在waitpid调用中使用了WUNTRACED选项。
- WEXITSTATUS(status):如果WIFEXITED(status)返回真,该宏返回由子进程调用_exit(status)或exit(status)时设置的调用参数status值。
- WTERMSIG(status):如果WIFSIGNALED(status)返回为真,该宏返回导致子进程退出的信号(signal)的值。
- WSTOPSIG(status):如果WIFSTOPPED(status)返回真,该宏返回导致子进程停止的信号(signal)值。
该调用返回退出的子进程的PID;或者发生错误时返回-1;或者设置了WNOHANG选项没有子进程退出就返回0;发生错误时,可能设置的错误代码如下:
- ECHILD:该调用指定的子进程pid不存在,或者不是发出调用进程的子进程。