6

Consider this trivial example of fork()ing then waiting for a child to die in Perl:

#!/usr/bin/perl

use strict;
use warnings;

if (fork() == 0) {
        exit(1);
}

waitpid(-1,0);

print $?;

Running the script on Solaris 10 I get this result:

$ perl test.pl
256

I suspect the values of are being shifted upwards because when I do exit(2) in the child, the output becomes 512.

I can't seem to find this documented in perl's waitpid. Is this a bug on my system or am I doing something wrong?

brian d foy
  • 129,424
  • 31
  • 207
  • 592
Mike
  • 58,961
  • 76
  • 175
  • 221

2 Answers2

24

It's documented in the $? section of the perlvar man page.

i.e. the real exit code is $? >> 8.

rjh
  • 49,276
  • 4
  • 56
  • 63
Sean
  • 29,130
  • 4
  • 80
  • 105
  • 9
    It's also covered in [perldoc -f system](http://perldoc.perl.org/functions/system.html). – Ether May 25 '10 at 22:54
2

The child might not even have gotten to call exit. As such, $? packs more information than just the exit parameter.

if    ( $? == -1  ) { die "Can't launch child: $!\n"; }
elsif ( $? & 0x7F ) { die "Child killed by signal ".( $? & 0x7F )."\n"; }
elsif ( $? >> 8   ) { die "Child exited with error ".( $? >> 8 )."\n"; }
else                { print "Child executed successfully\n"; }

This is documented more clearly in system's documentation.

ikegami
  • 367,544
  • 15
  • 269
  • 518