为什么Perl是$?为forked进程的退出代码返回错误的值?

时间:2010-05-25 22:34:09

标签: perl waitpid

考虑fork()这个琐碎的例子,等待孩子在Perl中死去:

#!/usr/bin/perl

use strict;
use warnings;

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

waitpid(-1,0);

print $?;

在Solaris 10上运行脚本我得到了这个结果:

$ perl test.pl
256

我怀疑值正在向上移动,因为当我在孩子中exit(2)时,输出变为512

我似乎无法在perl waitpid中找到此文档。这是我系统上的错误还是我做错了什么?

2 个答案:

答案 0 :(得分:24)

它记录在perlvar手册页的$?部分。

即。真正的退出代码是$? >> 8

答案 1 :(得分:2)

孩子可能甚至没有打电话给exit。因此,$?包含的信息不仅仅是exit参数。

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"; }

system的文档中更清楚地记录了这一点。