为什么在Perl中退出代码255而不是-1?

时间:2010-04-28 02:21:56

标签: perl exit

为什么当我将Perl中的退出代码$ ?, 8移动时,当我期望它为-1时,我得到255?

3 个答案:

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

另请参阅SO 774048SO 179565

答案 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之间。您的移动与计算机实际存储的负值相结合应该可以提供一些见解。