Tom Tanner Tom Tanner - 2 months ago 9
Perl Question

How come my fork/exec and close is losing the error code from the child

I have a piece of perl code that is roughly like this

my $pid = open(PIPE, '-|');
die "Unable to fork: $!\n" if !defined $pid;
if ($pid == 0)
{
open STDERR, '>&STDOUT' or die "Can't redirect STDERR to STDOUT\n";
exec(@cmd);
die "Unexpected exec failure: $!\n";
}
my @lines = (<PIPE>);
close PIPE;
if ($? != 0) { do stuff; }


However, for reasons I can't understand, possibly related to the actual program being called not existing, sometimes this fails to pick up the error from the child in
$?


@lines
contains the "Unexpected exec failure: File or directory does not exist" as expected (and some other output from a
$SIG{__DIE__}
handler), but
$?
is set to 0. I'm working round this for now by also checking the return from
close
which is fortunately set to 1. But where did my error code go?

Answer

Well, I found what it was.

Someone had added an END{} block in a library that was destroying the return codes (by calling system and hence destroying $?). I backed out the change and everything was happy.

Comments