wait , waitpid , wait3, wait364和 wait4 子例程

用途

等待一个子进程停止或结束。

标准 C 库 (libc.a)

语法

#include <sys/wait.h>
pid_t wait (StatusLocation)
int *StatusLocation;
pid_t wait ((void *) 0)
#include <sys/wait.h>
pid_t waitpid (ProcessID,StatusLocation,Options)
int *StatusLocation;
pid_t ProcessID;
int Options;
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
pid_t wait3 (StatusLocation, Options,ResourceUsage)
int *StatusLocation;
int Options; struct rusage *ResourceUsage;
pid_t wait364 (StatusLocation, Options,ResourceUsage)
int *StatusLocation;
int Options;
struct rusage64 *ResourceUsage;
pid_t wait4 (ProcessID,(StatusLocation, Options,ResourceUsage)
pid_t ProcessID;
int *StatusLocation;
int Options;
struct rusage64 *ResourceUsage;

描述

子例程将暂挂调用线程,直到进程接收到未被阻止或忽略的信号,或者直到任何一个调用进程的子进程停止或结束。 如果正在等待的子进程在调用之前停止或终止,那么 子例程将返回而不等待。 在成功退出时,终止的进程的 将由 子例程返回。

注: 子例程的效果可以通过 SIGCHLD 信号的设置进行修改。 如果由于子进程的状态可用而 SIGCHLD 被阻止并 等待 () 返回,并且没有其他子进程的状态可用,那么将清除任何暂挂的 SIGCHLD 信号。 有关详细信息,请参阅 签名 (sigaction , sigvec 或 signal 子例程) 子例程。

waitpid 子例程包含 ProcessID 参数,该参数允许调用线程根据以下规则从特定子进程集收集状态:

  • 如果 ProcessID 值等于值 -1,那么将为任何子进程请求状态。 在这方面, waitpid 子例程等同于 wait 子例程。
  • 大于 0 的 ProcessID 值指定请求其状态的单个子进程的进程标识。
  • 如果 ProcessID 参数等于 0 ,那么将为进程组标识等于调用线程的进程标识的任何子进程请求状态。
  • 如果 ProcessID 参数小于 0 ,那么将为进程组标识等于 ProcessID 参数的绝对值的任何子进程请求状态。

等待标识wait3wait364wait4 子例程变体提供 选项 参数,该参数可以修改子例程的行为。 定义了两个值 WNOHANGWUNTRACED,可以通过指定它们的按位包含 OR 来组合这些值。 WNOHANG 选项防止调用线程被暂挂,即使存在要等待的子进程也是如此。 在此情况下,将返回值 0 ,指示没有任何子进程停止或终止。 如果设置了 WUNTRACED 选项,那么该调用还会在当前进程的子代由于接收到 SIGTTIN SIGTTOU SIGSTP SIGTSTOP 信号而停止时返回信息。

可以调用 wait364 子例程来使 64 位 Rusage 计数器在 32 位环境中显式可用。

wait4() 子例程与 wait3() 子例程类似,但我们可以指定子代的进程标识。 wait3() 子例程将等待任何子进程,但 wait4() 子例程可以等待特定子进程。

通过 struct rusageru_utimeRu_stime 字段中的 wait3()wait4() 界面, 64 位应用程序也可以使用 64 位数量。

使用 跟踪调试 32 位进程时,如果该进程调用 负载卸载装入绑定,那么状态位置将设置为 _SLWTED 。 当使用 跟踪调试 64 位进程时,如果该进程调用 负载卸载,那么状态位置设置为 _SLWTED

如果启用了多处理调试方式,那么如果进程在 exec 子例程期间停止,那么状态位置设置为 W_SEWTED ; 如果进程在 fork 子例程期间停止,那么状态位置设置为 W_SFWTED

如果多个线程暂挂以等待同一子进程的终止,那么正好有一个线程在子进程终止时返回进程状态。

如果设置了 继续 选项,那么当当前进程的子代从作业控制停止继续,但未报告其状态时,该调用将返回信息。

参数

描述
StatusLocation 指向包含子进程终止状态的整数变量,如 sys/wait.h 文件中所定义。
ProcessID 指定子进程。
选项 修改子例程的行为。
ResourceUsage 指定要使用已终止子代的资源利用率信息完成的结构的位置。

返回 等待等待标识wait3wait4() 子例程时, StatusLocation 指向的值可用作 <sys/wait.h> 文件中定义的以下宏的 ReturnedValue 参数,以获取有关进程及其子进程的更多信息。

WIFCONTINUED(ReturnedValue)
pid_t ReturnedValue;

如果从作业控制停止继续的子进程返回了状态,那么将返回非零值。

WIFSTOPPED(ReturnedValue)
int ReturnedValue;

如果对已停止的子代返回状态,那么返回非零值。

int 
WSTOPSIG(ReturnedValue)
int ReturnedValue;

返回导致子代停止的信号的数量。

WIFEXITED(ReturnedValue)
int ReturnedValue;

如果返回状态以进行正常终止,那么返回非零值。

int 
WEXITSTATUS(ReturnedValue)
int ReturnedValue;

返回子级退出状态的低阶 8 位。

WIFSIGNALED(ReturnedValue)
int ReturnedValue;

如果针对异常终止返回状态,那么返回非零值。

int 
WTERMSIG(ReturnedValue)
int ReturnedValue;

返回导致子项终止的信号的数目。

返回值

如果 wait 子例程不成功,那么返回值 -1 ,并设置 errno 全局变量以指示错误。 此外,如果不存在已停止或已退出的子进程,并且指定了 WNOHANG 选项,那么 等待标识wait3wait364wait4 子例程将返回值 0。 如果没有已停止或已退出的子进程,那么 子例程也会返回 0。

错误代码

如果下列其中一项为 true ,那么 等待标识wait3wait364wait4 子例程不成功:

描述
ECHILD 调用线程的进程没有任何未等待子进程的现有进程。
EINTR 此子例程因接收到信号而终止。
EFAULT StatusLocationResourceUsage 参数指向进程地址空间外部的位置。

如果以下情况成立,那么 等待标识wait4 子例程不成功:

描述
ECHILD ProcessID 参数指定的进程或进程组标识不存在或不是调用进程的子进程。

如果以下情况成立,那么 等待标识wait3wait4 子例程将失败:

描述
EINVAL 选项 参数的值是无效的。