函数名称:pcntl_waitpid()
适用版本:PHP 4 >= 4.1.0, PHP 5, PHP 7
函数描述:等待或返回fork的子进程状态
用法: pcntl_waitpid(int $pid, int &$status [, int $options = 0 [, array &$rusage ]]) : int|bool
参数:
- $pid:必需,要等待的子进程的进程ID。如果为-1,则等待任何子进程。
- $status:必需,一个变量,用来存储子进程的退出状态。
- $options:可选,用于指定等待行为的选项。默认为0,表示阻塞等待。可以使用以下常量进行设置:
- WNOHANG:如果没有终止的子进程可用,则立即返回。
- WUNTRACED:如果子进程进入暂停状态,则也会返回。
- $rusage:可选,一个关联数组,用于存储子进程的资源使用情况,例如CPU时间和内存使用情况。
返回值:
- 如果成功,返回终止子进程的进程ID。
- 如果出错或没有可用的子进程,返回-1。
- 如果使用了WNOHANG选项,并且没有终止的子进程可用,则返回0。
示例:
$pid = pcntl_fork();
if ($pid == -1) {
die('fork 失败');
} elseif ($pid == 0) {
// 子进程代码
exit(0);
} else {
// 父进程代码
$status = 0;
$result = pcntl_waitpid($pid, $status);
if ($result == -1) {
echo "等待子进程失败\n";
} else {
if (pcntl_wifexited($status)) {
echo "子进程正常终止,退出状态为:" . pcntl_wexitstatus($status) . "\n";
} elseif (pcntl_wifsignaled($status)) {
echo "子进程被信号终止,终止信号为:" . pcntl_wtermsig($status) . "\n";
} elseif (pcntl_wifstopped($status)) {
echo "子进程进入暂停状态,暂停信号为:" . pcntl_wstopsig($status) . "\n";
}
}
}
以上示例中,首先使用pcntl_fork()创建了一个子进程。子进程在这里被简化为直接退出。父进程调用pcntl_waitpid()等待子进程的终止,并获取子进程的退出状态。然后根据不同的退出状态使用pcntl_wifexited()、pcntl_wifsignaled()和pcntl_wifstopped()进行判断,并使用相应的pcntl_wexitstatus()、pcntl_wtermsig()和pcntl_wstopsig()函数获取更详细的信息。