请您提供有关以下perl代码段的详细说明。我从谷歌得到了一些想法,但仍有很多基本的混乱。如果你可以提供小笔记,那将是非常有帮助的
$exit_value = $? >> 8;
$signal_num = $? & 127;
$dumped_core = $? & 128;
答案 0 :(得分:12)
引用The Doc:
<强> $吗
最后一个管道关闭,反引号(``)命令返回的状态, 成功调用wait()或waitpid(),或者从system()运算符调用。 这只是传统Unix返回的16位状态字 wait()系统调用(或者看起来像是这样)。就这样 子进程的退出值实际上是($?&gt;&gt; 8),而$? &安培; 127给出 哪个信号,如果有的话,这个过程死了,$? &安培; 128份报告 是否有核心转储。
>> 8
给出了16位字的高字节。
& 127
与& 0b01111111
基本相同,给出了该单词的低7位部分。
& 128
与& 0b10000000
相同,基本上是检查结果的第8位。
答案 1 :(得分:6)
if ($? == -1) {
print "failed to execute: $!\n";
}
elsif ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}
$?
语义来自wait
系统调用,请参阅man 2 wait
。
答案 2 :(得分:2)
use POSIX qw( WEXITSTATUS WIFEXITED );
if( WIFEXITED($?) ) {
print "The exit status was ", WEXITSTATUS($?), "\n";
}
另请参阅WIFSIGNALED
和WTERMSIG
。
另一个有用的C宏是WCOREDUMP
,在GNU C库中记录为(更加强调)
如果孩子产生了核心转储,则
WCOREDUMP(status)
返回true。仅当WIFSIGNALED返回true时才应使用此宏。 此宏未在POSIX.1-2001中指定,并且在某些Unix实现(例如,AIX,SunOS)上不可用。只能在
#ifdef WCOREDUMP
...#endif
中使用此内容。
自version 5.10.0以来,如果您的系统上有宏,则$?
计算($?>> 8)
的值为per includes WCOREDUMP
,如perlvar中所述:
因此,子流程的退出值实际为
$? & 127
,$? & 128
给出了流程死亡的信号(如果有的话),{{1}}报告是否存在核心转储