PHP Conference Japan 2024

pclose

(PHP 4, PHP 5, PHP 7, PHP 8)

pclose关闭进程文件指针

描述

pclose(资源 $handle): int

关闭由 popen() 打开的管道文件指针。

参数

handle

文件指针必须有效,并且必须是由 popen() 成功调用返回的。

返回值

返回运行的进程的终止状态。如果发生错误,则返回 -1

注意:

如果 PHP 使用 --enable-sigchild 编译,则此函数的返回值未定义。

示例

示例 #1 pclose() 示例

<?php
$handle
= popen('/bin/ls', 'r');
pclose($handle);
?>

备注

注意: 仅限 Unix 系统:

pclose() 在内部使用 waitpid(3) 系统调用实现。要获取真实的退出状态码,应使用 pcntl_wexitstatus() 函数。

参见

  • popen() - 打开进程文件指针

添加注释

用户贡献的注释 4 条注释

13
Uwe Ohse
9 年前
关于返回值
"返回运行的进程的终止状态。如果发生错误,则返回 -1。"
以及关于退出状态的说明:“pclose() 在内部使用 waitpid(3) 系统调用实现。要获取真实的退出状态码,应使用 pcntl_wexitstatus() 函数。”

返回值的文档说明,充其量是误导性的。该函数返回,与 proc_close() 一样
* 错误时返回 -1,
* 如果 WIFEXITED(status) 为真,则返回 WEXITSTATUS(status),或者
* 如果 WIFEXITED(status) 为假,则返回 status,
其中 status 是 waitpid() 的 status 参数。

这使得无法区分相对正常的退出或信号终止,并将 proc_close 返回代码的值降低为二进制值(正常/出现故障)。

这可以在 ext/standard/proc_open.c (PHP 5.4.44, 5.6.12) 中的 proc_open_rsrc_dtor() 中看到。

建议使用 pcntl_wexitstatus 的说明是完全错误的。无法使用 pcntl_wexitstatus,因为它已经被使用了。
3
kcross at nssolutions dot com
21 年前
在 4.1.1 和 4.2.3 之间,pclose 的返回值发生了变化。

退出状态过去位于第二个字节中,因此状态为 (pclose($fp)/256)。

现在它位于低位字节中,因此状态只是 pclose($fp)。

小心。
2
vdweij at mailsurf dot com
21 年前
据我理解,如果 popen 无法执行指定的命令,pclose 将在每个平台上返回 0。

由于 popen 只返回它是否能够发送命令的状态,而不是它是否成功执行的状态。只有 pclose 的返回值才能用于检查是否可以执行命令。
1
Mike
16 年前
如另一个注释中所指出的,终止状态与进程的退出状态不同。但是,“pclose($fp)/256”之类的代码不是提取退出状态的正确方法,因为它使用了关于终止状态中存储退出状态的位置的特定于系统和版本的知识。(此外,进程甚至可能没有正常退出,因此它可能根本没有退出状态。)

相反,应该使用函数 pcntl_wifexited() 和 pcntl_wexitstatus()。它们是 C 宏 WIFEXITED() 和 WEXITSTATUS() 的包装器,旨在分别确定进程是否具有退出状态以及该状态是什么。
To Top