pclose

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

pclose关闭进程文件指针

描述

pclose(资源 $handle): 整数

关闭由 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
8 年前
关于返回值
"返回已运行进程的终止状态。如果出现错误,则返回 -1。 "
以及关于退出状态的说明:"pclose() 在内部使用 waitpid(3) 系统调用实现。若要获取真正的退出状态代码,应使用 pcntl_wexitstatus() 函数。"

返回值的文档最多是误导性的。该函数与 proc_close() 一样返回
* -1 发生错误时,
* WEXITSTATUS(status) 如果 WIFEXITED(status) 为真,或
* status 如果 WIFEXITED(status) 为假,
其中 status 是 waitpid() 的 status 参数。

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

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

建议使用 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