为什么当我将Perl中的退出代码$ ?, 8移动时,当我期望它为-1时,我得到255?
答案 0 :(得分:20)
'wait()'返回的退出状态是一个16位值。在这16位中,高8位来自'exit()'返回的值的低8位 - 或来自main()
的值。如果程序自然死亡,则16的低8位全部为零。如果程序因信号而死,则低8位编码信号编号,并指示是否发生核心转储。对于一个信号,退出状态被视为零 - 像shell这样的程序倾向于将低阶位非零解释为失败。
15 8 7 0 Bit Position
+-----------------+
| exit | signal |
+-----------------+
大多数机器实际上将16位值存储在32位整数中,并且使用无符号算术处理。如果进程以'exit(-1)'退出,则16的高阶8位可以全1,但是当右移8位时,它将显示为255。
如果你真的想将值转换为有符号的数量,你必须根据第16位进行一些比特纠缠。
$status >>= 8;
($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status;
答案 1 :(得分:10)
Perl以与C运行时库宏WEXITSTATUS
相同的方式返回子进程退出代码,其在wait(2)
中有以下描述:
WEXITSTATUS(status) evaluates to the least significant eight bits of the return code of the child which terminated, which may have been set as the argument to a call to exit() or as the argument for a return statement in the main program. This macro can only be evaluated if WIFEXITED returned non-zero.
这里重要的部分是最低有效8位。这就是您获得255的退出代码的原因。perlvar
手册页描述了$?
,如下所示:
$? The status returned by the last pipe close, backtick (‘‘) com- mand, successful call to wait() or waitpid(), or from the sys- tem() operator. This is just the 16-bit status word returned by the wait() system call (or else is made up to look like it). Thus, the exit value of the subprocess is really ("$? >> 8"), and "$? & 127" gives which signal, if any, the process died from, and "$? & 128" reports whether there was a core dump.
退出代码中的负数没有特殊处理。
答案 2 :(得分:0)
你改变哪种方式?请提供代码示例。
也:
perldoc -f system
给出了一个非常容易理解的如何处理$?
的例子此外,http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html
退出值应介于0到255之间。您的移动与计算机实际存储的负值相结合应该可以提供一些见解。