R
r.u
Hi folks,
I'm flummuxed. I just can't get the function below to capture
the output from STDERR of a program (ploticus in case, but
anything that writes to STDERR will do) in $err. It always
arrives in $out. Any ideas???
-RU
--snip--
sub run_ploticus
{
my $param_ref = shift;
my $debug = 0;
my ($read_fh, $write_fh, $err_fh);
$debug && print "run_ploticus()\n";
my @cmd = ($PLOTICUS_CMD, @{ $param_ref });
$debug && print "CMD: [", join(' ', @cmd), "]\n";
my $pid = open3($write_fh, $read_fh, $err_fh, @cmd);
close($write_fh);
# read output until EOF
my ($rout, $rin, $eout, $ein);
$rin = $ein = '';
my $nclosed = 0;
my ($buf, $ret, $out, $err);
my ($out_open, $err_open) = (1, 1);
my $want_closed = 0;
if (defined($read_fh)) {
vec($rin, fileno($read_fh), 1) = 1;
$want_closed++;
}
if (defined($err_fh)) {
vec($ein, fileno($err_fh), 1) = 1;
$want_closed++;
}
$debug && print " going into read loop...\n";
while ($nclosed < $want_closed) {
$debug && print "top of while, nclosed=[$nclosed]\n";
my $nfound = select($rout=$rin, undef, $eout=$ein, undef);
$debug && print "after select, nfound=[$nfound]\n";
if ($nfound) {
if ($eout) {
$debug && print "stderr has something...\n";
$ret = sysread($err_fh, $buf, 512);
$debug && print "read [$ret] bytes\n";
if ($ret == 0) {
$nclosed++;
$debug && print "incrementing nclosed\n";
$err_open = 0;
next;
}
$debug && print " STDERR: [$buf]\n";
$err .= $buf;
}
if ($rout)
{
$debug && print "stdout has something...\n";
$ret = sysread($read_fh, $buf, 512);
$debug && print "read [$ret] bytes\n";
if ($ret == 0) {
$nclosed++;
$debug && print "incrementing nclosed\n";
$out_open = 0;
next;
}
$debug && print " STDOUT: [$buf]\n";
$out .= $buf;
}
}
}
defined($read_fh) && close($read_fh);
defined($err_fh) && close($err_fh);
waitpid($pid, 0);
my $status = $?;
$debug && print "waitpid returned status [$status]\n";
if (defined($err)) {
$debug && print " returning error\n";
return (0, $err);
}
$debug && print " returning success\n";
return (1, undef);
}
I'm flummuxed. I just can't get the function below to capture
the output from STDERR of a program (ploticus in case, but
anything that writes to STDERR will do) in $err. It always
arrives in $out. Any ideas???
-RU
--snip--
sub run_ploticus
{
my $param_ref = shift;
my $debug = 0;
my ($read_fh, $write_fh, $err_fh);
$debug && print "run_ploticus()\n";
my @cmd = ($PLOTICUS_CMD, @{ $param_ref });
$debug && print "CMD: [", join(' ', @cmd), "]\n";
my $pid = open3($write_fh, $read_fh, $err_fh, @cmd);
close($write_fh);
# read output until EOF
my ($rout, $rin, $eout, $ein);
$rin = $ein = '';
my $nclosed = 0;
my ($buf, $ret, $out, $err);
my ($out_open, $err_open) = (1, 1);
my $want_closed = 0;
if (defined($read_fh)) {
vec($rin, fileno($read_fh), 1) = 1;
$want_closed++;
}
if (defined($err_fh)) {
vec($ein, fileno($err_fh), 1) = 1;
$want_closed++;
}
$debug && print " going into read loop...\n";
while ($nclosed < $want_closed) {
$debug && print "top of while, nclosed=[$nclosed]\n";
my $nfound = select($rout=$rin, undef, $eout=$ein, undef);
$debug && print "after select, nfound=[$nfound]\n";
if ($nfound) {
if ($eout) {
$debug && print "stderr has something...\n";
$ret = sysread($err_fh, $buf, 512);
$debug && print "read [$ret] bytes\n";
if ($ret == 0) {
$nclosed++;
$debug && print "incrementing nclosed\n";
$err_open = 0;
next;
}
$debug && print " STDERR: [$buf]\n";
$err .= $buf;
}
if ($rout)
{
$debug && print "stdout has something...\n";
$ret = sysread($read_fh, $buf, 512);
$debug && print "read [$ret] bytes\n";
if ($ret == 0) {
$nclosed++;
$debug && print "incrementing nclosed\n";
$out_open = 0;
next;
}
$debug && print " STDOUT: [$buf]\n";
$out .= $buf;
}
}
}
defined($read_fh) && close($read_fh);
defined($err_fh) && close($err_fh);
waitpid($pid, 0);
my $status = $?;
$debug && print "waitpid returned status [$status]\n";
if (defined($err)) {
$debug && print " returning error\n";
return (0, $err);
}
$debug && print " returning success\n";
return (1, undef);
}