- 本文地址: https://www.laruence.com/2012/02/01/2503.html
- 转载请注明出处
今天有人在微博上问了一个问题, 使用:
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 |
Wonderful blog you have. thaks a lot
Bigo88 merupakan situs terpercaya yang ada di indonesia dan telah dipercaya oleh ratusan bahkan ribuan pemain yang memainkan permainan slot maupun judi online di indonesia.
KUDABET merupakan situs Agen Bola Piala Dunia Terpercaya Dengan uang asli yang telah terjamin kemenangannya, selain itu sangat banyak keuntungan yang bisa Anda dapatkan hanya dengan bermain dari satu user ID saja.
mufasabet Earn real money without investment 2023 new dimension of making money
https://www.richawingames.com/
学c语言也遇到了这个问题,谢谢大佬
ltobet
Good I appreciated your work very thanks
truthbet
The best sites in Thailand and make good money
[…] 本文地址: http://www.laruence.com/2012/02/01/2503.html […]
可以的,这很鸟哥! 解释的很清楚
[…] references from the following: http://www.laruence.com/2012/02/01/2503.html […]
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.
膜拜,,西安罢餐,致敬!
虽然我看不懂···
但膜拜一下
请问退出之后的code是11是怎么回事?
这个不错
又充了下电啦
赞
哈 了解了
你太牛逼了。膜拜!!!