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.