PHP Files
Reading Standard Error from a Program
Problem
You want to read the error output from a program. For example, you want to capture the system calls displayed by strace(1).
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) or die($php_errormsg);
}
pclose($ph) or die($php_errormsg);
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. You do this by redirecting it to /dev/null on Unix and NUL on Windows:
// Unix: only read standard error
$ph = popen('strace ls 2>&1 1>/dev/null','r') or die($php_errormsg);
// Windows: only read standard error
$ph = popen('ipxroute.exe 2>&1 1>NUL','r') or die($php_errormsg);
No comments:
Post a Comment