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);