Why is Perl's $? returning the wrong value for the exit code of a forked process?
Asked Answered
F

2

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?

Fern answered 25/5, 2010 at 22:34 Comment(0)
S
24

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

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

Spoor answered 25/5, 2010 at 22:36 Comment(1)
It's also covered in perldoc -f system.Welloiled
P
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.

Protractile answered 19/8, 2016 at 16:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.