pcntl_waitid
(PHP 8 >= 8.4.0)
pcntl_waitid — 等待子进程改变状态
说明
获取与终止、停止和/或继续事件有关的状态信息,这些事件发生在调用者的一个子进程中。
除非传递了 WNOHANG
标志,否则调用进程将被阻塞,直到发生错误,
或者满足以下所有条件的状态信息变得可用:
-
由
idtype
和id
参数指定的一组子进程中的一个子进程的状态信息。 -
状态信息的状态更改与在
flags
参数中设置的状态更改标志之一匹配。
如果在调用 pcntl_waitid() 之前有匹配的状态信息可用,则返回将是立即的。 如果有两个或两个以上的子进程的匹配状态信息可用,则其状态报告的顺序是未指定的。
注意:
本文档涵盖了 POSIX 规范中
waitid
函数的说明,以及在 Linux、NetBSD 和 FreeBSD 上的实现中的一些额外参数。 请查看您系统的waitid(2)
man 手册,以获取有关waitid
在您系统上的工作方式的具体细节。
参数
idtype
id
-
idtype
和id
参数用于指定要等待的子进程。POSIX 标准 idtype
和id
参数如果 idtype
是P_ALL
等待任何子进程, id
被忽略。如果 idtype
是P_PID
等待进程 ID 等于 id
的子进程。如果 idtype
是P_PGID
等待进程组 ID 等于 id
的任何子进程。Linux 特定 idtype
和id
参数如果 idtype
是P_PIDFD
(自 Linux 5.4 起)等待由 id
中指定的 PID 文件描述符引用的子进程。 (有关 PID 文件描述符的详细信息,请参见 Linuxpidfd_open(2)
man 手册)NetBSD 和 FreeBSD 特定 idtype
和id
参数如果 idtype
是P_UID
等待有效用户 ID 等于 id
的进程。如果 idtype
是P_GID
等待有效组 ID 等于 id
的进程。如果 idtype
是P_SID
等待会话 ID 等于 id
的进程。 如果子进程启动了自己的会话,其会话 ID 将与其进程 ID 相同。 否则,子进程的会话 ID 将与调用者的会话 ID 匹配。FreeBSD 特定 idtype
和id
参数如果 idtype
是P_JAILID
等待在其 jail 标识符等于 id
的 jail 中的进程。 info
-
info
参数设置为一个包含有关信号的信息的数组。info
数组可能包含以下键:signo
:信号量errno
:系统错误号code
:信号代码status
:退出值或信号pid
:发送进程 IDuid
:发送进程的真实用户 IDutime
:用户消耗的时间stime
:系统消耗的时间
flags
-
flags
的值是零个或多个以下常量的值,这些常量通过 OR 运算在一起:flags
的可能值WCONTINUED
为任何继续自作业控制停止的子进程返回状态。 控制停止后,要么没有报告过其状态,要么只有通过设置了 WNOWAIT
标志的 pcntl_waitid() 调用报告过其状态。WEXITED
返回已退出的子进程的状态。 WNOHANG
如果没有可用的状态,则不挂起;立即返回。 WNOWAIT
保持状态返回在 info
中的进程处于可等待状态。 这不会影响进程的状态;在此调用完成后,可以再次等待该进程。WSTOPPED
返回已停止的子进程的状态。 控制停止后,要么没有报告过其状态,要么只有通过设置了 WNOWAIT
标志的 pcntl_waitid() 调用报告过其状态。
返回值
pcntl_waitid() 如果指定了 WNOHANG
并且状态对于由
idtype
和 id
指定的任何进程都不可用,则返回 true
。
如果由于其一个子进程的状态更改而返回 true
,则 pcntl_waitid() 返回 true
。
否则,返回 false
,并且可以使用 pcntl_get_last_error() 来获取 errno
错误号。
注意:
一旦获得了一个
errno
错误号,可以使用 pcntl_strerror() 来获取与之关联的文本消息。
错误/异常
ECHILD |
调用进程没有未等待的子进程。 |
EINTR |
pcntl_waitid() 被一个信号中断。 |
EINVAL |
为 flags 指定了一个无效值,
或者 idtype 和 id 指定了一组无效的进程。
|
参见
- pcntl_waitpid() - 等待或返回 fork 的子进程状态
- pcntl_wait() - 等待或返回 fork 的子进程状态
- pcntl_fork() - 在当前进程当前位置产生分叉(fork)
- pcntl_signal() - 安装信号处理程序
- pcntl_wifexited() - 检查状态代码是否代表一个正常的退出
- pcntl_wifstopped() - 检查子进程当前是否已经停止
- pcntl_wifsignaled() - 检查子进程状态码是否代表由于某个信号而中断
- pcntl_wexitstatus() - 返回一个中断的子进程的返回代码
- pcntl_wtermsig() - 返回导致子进程中断的信号
- pcntl_wstopsig() - 返回导致子进程停止的信号
用户贡献的备注
备份地址:http://www.lvesu.com/blog/php/function.pcntl-waitid.php