考虑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中找到此文档。这是我系统上的错误还是我做错了什么?
答案 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
的文档中更清楚地记录了这一点。