Ha, I'm on win32, using local $?; reveals a bug in the fork emulation, the effect is opposite of what it should be, using local $? should not cause $? to be used for exit value (which should be the default behavior) package Foo;
use strict;
use warnings;
sub new {
bless {}, shift;
}
sub DESTROY {
warn "$$: destroy";
local $? if @ARGV;
system("waaaah");
}
package main;
use strict;
use warnings;
use POSIX ":sys_wait_h";
my $foo = Foo->new();
my $pid = fork();
die "fork failed" if !defined $pid;
if( $pid ) {
# parent
print "$$: parent\n";
} else {
# child
print "$$: child\n";
# system("waaaah");
exit 5;
}
my $reaped = waitpid($pid, 0);
print "reaped( $reaped) \$?( $? ) >> 8 ( @{[ $? >> 8 ]} )\n";
#~ my $child_exit_status = POSIX::WEXITSTATUS($?);
#~ print "pid=$reaped status: $child_exit_status\n";
__END__
$ perl fudge
2060: parent
-3360: child
-3360: destroy at fudge line 8.
'waaaah' is not recognized as an internal or external command,
operable program or batch file.
reaped( -3360) $?( 0 ) >> 8 ( 0 )
2060: destroy at fudge line 8.
'waaaah' is not recognized as an internal or external command,
operable program or batch file.
$ perl fudge local
1628: parent
-3804: child
-3804: destroy at fudge line 8.
'waaaah' is not recognized as an internal or external command,
operable program or batch file.
reaped( -3804) $?( 1280 ) >> 8 ( 5 )
1628: destroy at fudge line 8.
'waaaah' is not recognized as an internal or external command,
operable program or batch file.
| [reply] [d/l] [select] |