pcntl_waitid

(PHP 8 >= 8.4.0)

pcntl_waitid等待子进程改变状态

说明

pcntl_waitid(
    int $idtype = P_ALL,
    int $id = null,
    array &$info = [],
    int $flags = WEXITED
): bool

获取与终止、停止和/或继续事件有关的状态信息,这些事件发生在调用者的一个子进程中。

除非传递了 WNOHANG 标志,否则调用进程将被阻塞,直到发生错误, 或者满足以下所有条件的状态信息变得可用:

  • idtypeid 参数指定的一组子进程中的一个子进程的状态信息。
  • 状态信息的状态更改与在 flags 参数中设置的状态更改标志之一匹配。

如果在调用 pcntl_waitid() 之前有匹配的状态信息可用,则返回将是立即的。 如果有两个或两个以上的子进程的匹配状态信息可用,则其状态报告的顺序是未指定的。

注意:

本文档涵盖了 POSIX 规范中 waitid 函数的说明,以及在 Linux、NetBSD 和 FreeBSD 上的实现中的一些额外参数。 请查看您系统的 waitid(2) man 手册,以获取有关 waitid 在您系统上的工作方式的具体细节。

参数

idtype
id
idtypeid 参数用于指定要等待的子进程。
POSIX 标准 idtypeid 参数
如果 idtypeP_ALL 等待任何子进程,id 被忽略。
如果 idtypeP_PID 等待进程 ID 等于 id 的子进程。
如果 idtypeP_PGID 等待进程组 ID 等于 id 的任何子进程。
Linux 特定 idtypeid 参数
如果 idtypeP_PIDFD(自 Linux 5.4 起) 等待由 id 中指定的 PID 文件描述符引用的子进程。 (有关 PID 文件描述符的详细信息,请参见 Linux pidfd_open(2) man 手册)
NetBSD 和 FreeBSD 特定 idtypeid 参数
如果 idtypeP_UID 等待有效用户 ID 等于 id 的进程。
如果 idtypeP_GID 等待有效组 ID 等于 id 的进程。
如果 idtypeP_SID 等待会话 ID 等于 id 的进程。 如果子进程启动了自己的会话,其会话 ID 将与其进程 ID 相同。 否则,子进程的会话 ID 将与调用者的会话 ID 匹配。
FreeBSD 特定 idtypeid 参数
如果 idtypeP_JAILID 等待在其 jail 标识符等于 id 的 jail 中的进程。
info

info 参数设置为一个包含有关信号的信息的数组。

info 数组可能包含以下键:

  • signo:信号量
  • errno:系统错误号
  • code:信号代码
  • status:退出值或信号
  • pid:发送进程 ID
  • uid:发送进程的真实用户 ID
  • utime:用户消耗的时间
  • stime:系统消耗的时间

flags

flags 的值是零个或多个以下常量的值,这些常量通过 OR 运算在一起:

flags 的可能值
WCONTINUED 为任何继续自作业控制停止的子进程返回状态。 控制停止后,要么没有报告过其状态,要么只有通过设置了 WNOWAIT 标志的 pcntl_waitid() 调用报告过其状态。
WEXITED 返回已退出的子进程的状态。
WNOHANG 如果没有可用的状态,则不挂起;立即返回。
WNOWAIT 保持状态返回在 info 中的进程处于可等待状态。 这不会影响进程的状态;在此调用完成后,可以再次等待该进程。
WSTOPPED 返回已停止的子进程的状态。 控制停止后,要么没有报告过其状态,要么只有通过设置了 WNOWAIT 标志的 pcntl_waitid() 调用报告过其状态。

返回值

pcntl_waitid() 如果指定了 WNOHANG 并且状态对于由 idtypeid 指定的任何进程都不可用,则返回 true

如果由于其一个子进程的状态更改而返回 true,则 pcntl_waitid() 返回 true

否则,返回 false,并且可以使用 pcntl_get_last_error() 来获取 errno 错误号。

注意:

一旦获得了一个 errno 错误号,可以使用 pcntl_strerror() 来获取与之关联的文本消息。

错误/异常

错误号 (errno) 值
ECHILD 调用进程没有未等待的子进程。
EINTR pcntl_waitid() 被一个信号中断。
EINVAL flags 指定了一个无效值, 或者 idtypeid 指定了一组无效的进程。

参见