从$中提取信息?

时间:2012-03-01 08:37:11

标签: perl

请您提供有关以下perl代码段的详细说明。我从谷歌得到了一些想法,但仍有很多基本的混乱。如果你可以提供小笔记,那将是非常有帮助的

$exit_value  = $? >> 8;
$signal_num  = $? & 127;
$dumped_core = $? & 128;

3 个答案:

答案 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)

请参阅perldoc -f system

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

另请参阅WIFSIGNALEDWTERMSIG

另一个有用的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}}报告是否存在核心转储