Press "Enter" to skip to content

使用exit(-1)为什么得到255退出码?

今天有人在微博上问了一个问题, 使用:

string exec ( string $command [, array &$output [, int &$return_var ]] )

调用一个程序, 程序退出-1, 但是PHP得到的为什么是255?
这个问题简单的说, 是因为exit或者main函数中的return, 只能使用0~255之间的值. -1 的unsigned值就是255.
那么复杂点的说呢?
我们知道, 在Shell中, 运行一个命令, 一个程序, 都是fork一个子进程(然后exec)来执行的, 而这个程序的退出码, 被Shell(父进程), 通过wait来收集而后报告给我们的.

pid_t wait(int *statloc);

而对于wait来说, 历史上原因, 他将通过statloc返回一个16bit的interge(现在也有用32位表示的, 但是会兼容已有的设计). 这16bits的interge中, 高8位就是程序退出的值(exit, 或者return), 而低八位表示导致这个程序退出的信号(其中一位表示是否有Core文件产生), 如果程序是正常退出, 那么低八位为0[1].
所以, 如果我们返回-1, 并且因为我们是正常退出, 所以Shell通过wait收集到的子进程退出状态是:

11111111 00000000

而高八位作为unsigned, 就是255了.
另外, 补充一下, 在Linux的内建Shell命令中, 很多都会遵守一个退出状态码的约定, 具体的值对应的意思[2]:

Exit Code Number Meaning Example Comments
1 Catchall for general errors let "var1 = 1/0" Miscellaneous errors, such as "divide by zero" and other impermissible operations
2 Misuse of shell builtins (according to Bash documentation) empty_function() {} Seldom seen, usually defaults to exit code 1
126 Command invoked cannot execute Permission problem or command is not an executable
127 "command not found" illegal_command Possible problem with $PATH or a typo
128 Invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255 (see first footnote)
128+n Fatal error signal "n" kill -9 $PPID of script $? returns 137 (128 + 9)
130 Script terminated by Control-C Control-C is fatal error signal 2, (130 = 128 + 2, see above)
255* Exit status out of range exit -1 exit takes only integer args in the range 0 - 255

11 Comments

  1. Falcon
    Falcon July 27, 2016

    可以的,这很鸟哥! 解释的很清楚

  2. Nonton film online Gratis
    Nonton film online Gratis October 13, 2015

    I’ve been exploring for a little for any
    high-quality articles or weblog posts in this
    kind of house . Explorring in Yahoo I eventually stumbled upon this
    website. Studying this info So i’m glad too express that I have a very excellent uncanny eeling I found out exacgly what I needed.
    I most indisputably will make ceretain to don?t put out of your mind this website
    and give it a glance regularly.

  3. 膜拜
    膜拜 July 28, 2012

    膜拜,,西安罢餐,致敬!

  4. deven
    deven April 12, 2012

    虽然我看不懂···
    但膜拜一下

  5. Lukin
    Lukin March 15, 2012

    请问退出之后的code是11是怎么回事?

  6. ooxx
    ooxx February 3, 2012

    这个不错

  7. 唐僧
    唐僧 February 2, 2012

    你太牛逼了。膜拜!!!

Leave a Reply

Your email address will not be published. Required fields are marked *