English | 简体中文 | 繁體中文
查询

pcntl_waitpid()函数—用法及示例

「 等待或返回fork的子进程状态 」


函数名称: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

参数:

  1. $pid:必需,要等待的子进程的进程ID。如果为-1,则等待任何子进程。
  2. $status:必需,一个变量,用来存储子进程的退出状态。
  3. $options:可选,用于指定等待行为的选项。默认为0,表示阻塞等待。可以使用以下常量进行设置:
    • WNOHANG:如果没有终止的子进程可用,则立即返回。
    • WUNTRACED:如果子进程进入暂停状态,则也会返回。
  4. $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()函数获取更详细的信息。

补充纠错
上一个函数: pcntl_wexitstatus()函数
下一个函数: pcntl_wait()函数
热门PHP函数
分享链接