Recipe 18.24 Reading Standard Error from a Program
18.24.1 Problem
You want to read
the error output from a program; for example, you want to capture the
system calls displayed by
strace(1) .
18.24.2 Solution
Redirect standard error to
standard output by adding 2>&1 to the
command line passed to popen(
). Read
standard output by opening the pipe in
r
mode:
$ph = popen('strace ls 2>&1','r') or die($php_errormsg);
while (!feof($ph)) {
$s = fgets($ph,1048576) or die($php_errormsg);
}
pclose($ph) or die($php_errormsg);
18.24.3 Discussion
In both the Unix
sh and the Windows
cmd.exe shells, standard error is file
descriptor 2, and standard output is file descriptor 1.
Appending
2>&1 to a command tells the
shell to redirect
what's normally sent to file descriptor 2 (standard
error) over to file descriptor 1 (standard output). fgets(
) then reads both standard error and standard output.
This technique reads in standard error but doesn't
provide a way to distinguish it from standard output. To read just
standard error, you need to prevent standard output from being
returned through the pipe. This is done by redirecting it to
/dev/null on Unix and
NUL on Windows:
// Unix: just read standard error
$ph = popen('strace ls 2>&1 1>/dev/null','r') or die($php_errormsg);
// Windows: just read standard error
$ph = popen('ipxroute.exe 2>&1 1>NUL','r') or die($php_errormsg);
18.24.4 See Also
Documentation on popen( ) at
http://www.php.net/popen; see your
popen(3) manpage for details about the shell
your system uses with popen( ); for information
about shell redirection, see the Redirection section of the
sh(1) manpage on Unix systems; on Windows, see
the entry on redirection in the Command Reference section of your
system help.
|