Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > STDOUT and STDERR redirection fails for forked process

Reply
Thread Tools

STDOUT and STDERR redirection fails for forked process

 
 
Peter
Guest
Posts: n/a
 
      07-19-2007
Hi,

Read the manpages, googled around, found some samples and followed
those to get it to work... but still fails..

What do i want? Simply, fork a command using the OPEN instruction,
redirect STDERR to STDOUT and capture the returncode of the executed
command.
I wrote the code wich is printed below, which works fine. Only output
from STDERR is not redirected to STDOUT but printed to the terminal
and the returncode is not captured. (So somehow redirected to STDOUT
but outside the open statement).

e.g. when the routine executes 'ls -Q' which sends the errormessage to
STDERR and a RC=2, the output from STDERR is printed to the terminal
and the returncode ($?) is 0.

Any ideas? suggestions?

Peter

Jul19 10:01:40 INF Data received from client "05794A6E5CD1122F ls -Q"
Jul19 10:01:40 DBG subroutine loccmd (15) (ls -Q)
Jul19 10:01:40 DBG Issuing command 'ls -Q'
ls: Not a recognized flag: Q
Usage: ls [-1ACFLNRabcdefgilmnopqrstuxE] [File...]
Jul19 10:01:40 DBG leaving subroutine loccmd passing values '0' '' ''


eval {
local $SIG{ALRM} = sub { die "Timed Out!\n" } ;
# set the alarm
alarm($timeout);

## Issue the command by forking the process and monitoring the
output
if (open STATUS, "$cmdstr 2>&1 |") {
while (<STATUS>) {
$result .= $_ ;
}
$errmsg = $! ;
$rcverror = $? ;

close STATUS ;
}
else {
$errmsg = "Fork failed for \'$cmdstr\'" ;
$rcverror = -2 ;
}

# reset the alarm
alarm(0) ;
$rcvtimeout = 0 ;
} ;

 
Reply With Quote
 
 
 
 
anno4000@radom.zrz.tu-berlin.de
Guest
Posts: n/a
 
      07-19-2007
Peter <(E-Mail Removed)> wrote in comp.lang.perl.misc:
> Hi,
>
> Read the manpages, googled around, found some samples and followed
> those to get it to work... but still fails..
>
> What do i want? Simply, fork a command using the OPEN instruction,
> redirect STDERR to STDOUT and capture the returncode of the executed
> command.
> I wrote the code wich is printed below, which works fine. Only output
> from STDERR is not redirected to STDOUT but printed to the terminal
> and the returncode is not captured. (So somehow redirected to STDOUT
> but outside the open statement).
>
> e.g. when the routine executes 'ls -Q' which sends the errormessage to
> STDERR and a RC=2, the output from STDERR is printed to the terminal
> and the returncode ($?) is 0.
>
> Any ideas? suggestions?
>
> Peter
>
> Jul19 10:01:40 INF Data received from client "05794A6E5CD1122F ls -Q"
> Jul19 10:01:40 DBG subroutine loccmd (15) (ls -Q)
> Jul19 10:01:40 DBG Issuing command 'ls -Q'
> ls: Not a recognized flag: Q
> Usage: ls [-1ACFLNRabcdefgilmnopqrstuxE] [File...]
> Jul19 10:01:40 DBG leaving subroutine loccmd passing values '0' '' ''


This is not the output of the code you showed. How can we help
you when you don't give us consistent information?

> eval {
> local $SIG{ALRM} = sub { die "Timed Out!\n" } ;
> # set the alarm
> alarm($timeout);
>
> ## Issue the command by forking the process and monitoring the
> output
> if (open STATUS, "$cmdstr 2>&1 |") {
> while (<STATUS>) {
> $result .= $_ ;
> }
> $errmsg = $! ;
> $rcverror = $? ;
>
> close STATUS ;
> }
> else {
> $errmsg = "Fork failed for \'$cmdstr\'" ;
> $rcverror = -2 ;
> }
>
> # reset the alarm
> alarm(0) ;
> $rcvtimeout = 0 ;
> } ;


That code is a mess. It isn't strict-safe. Why is everything wrapped
in an eval block? What is the value of $timeout? Or is it $rcvtimeout?
You are accessing $? too early. The return code is only put there after
close().

Reducing your code to the essentials (something *you* should have done),
this is what remains:

my $cmdstr = 'ls -9'; # -Q is a valid flag in some systems
open STATUS, '-|', "$cmdstr 2>&1";
print ">>> $_" while <STATUS>;
close STATUS;
print "retcode: $?\n";
exit;

This prints:

>>> ls: invalid option -- 9
>>> Try `ls --help' for more information.

retcode: 256

Note the ">>>" in front of the error message. It shows that the error
is not printed to stdout by the command but is caught and printed by
the perl program. The effect you complain about simply isn't there.

So what is this all about?

Anno
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Is there anyway to set stdout and stderr for a spawned process subrahmanya C++ 1 04-25-2008 04:10 PM
stderr stdout redirection with Ruby ??? unbewust Ruby 6 08-11-2007 01:21 PM
STDOUT and STDERR redirection fails for forked process Peter Perl Misc 1 07-20-2007 06:02 PM
sys.stdout / sys.stderr, subprocess, redirection Roman Neuhauser Python 0 04-04-2005 08:57 PM
Getting STDERR from forked child processes? Zbigniew Fiedorowicz Perl Misc 2 02-05-2004 08:04 PM



Advertisments