为啥超过 255 的返回码在 C++ 中返回不同的数字?
Posted
技术标签:
【中文标题】为啥超过 255 的返回码在 C++ 中返回不同的数字?【英文标题】:Why do return codes over 255 return a differnt number in C++?为什么超过 255 的返回码在 C++ 中返回不同的数字? 【发布时间】:2016-01-20 23:23:40 【问题描述】:例如...
#include <iostream>
using namespace std;
int main()return 300;
返回:
Process finished with exit code 44
??
【问题讨论】:
它只占用 8 位。300 & 0xff == 44
。很确定这主要是 Unix 的东西。请参阅 waitpid
联机帮助页中的 WEXITSTATUS
- 状态是 OR'd 到其他一些值。
你能解释一下原因吗?是否可以返回更高的数字?
没有超过 255 的返回码。操作系统会忽略前八位之外的任何位。
或许值得指出的是,这只适用于程序的返回码。显然,非主函数可以返回任何他们喜欢的东西。通常程序返回码只是用于错误处理,所以 255 个值就足够了(您的实际输出通常应该转到标准输出,以便可以通过管道传输)
进程返回码的处理将取决于操作系统,而 C++ 标准基本上只是说实现定义了发生的事情。
【参考方案1】:
标准只知道两个标准化的返回值:EXIT_SUCCESS
(或零)和EXIT_- FAILURE
:
3.6.1/5 main 中的 return 语句具有离开 main 函数的效果(销毁任何具有自动存储持续时间的对象)和 以返回值作为参数调用
std::exit
。18.5/8 (...) 最后,控制权返回到宿主环境。如果状态为零或
EXIT_SUCCESS
,则状态的实现定义形式 返回成功终止。如果状态为EXIT_- FAILURE
,则 状态不成功终止的实现定义形式是 回来。 否则返回的状态是实现定义的。
因此不能保证任何其他整数都按原样返回。
以MS Windows 为例,GetExitCodeProcess()
函数返回整数值,因此您将得到 300。
在POSIX 兼容系统上,例如Linux,规则是(“只有 8 个最低有效位(即状态和 0377)可供等待的父进程使用”) .所以对于 300,它将是 44。
【讨论】:
其实在unix下,退出码在MSB中,所以(status & 0xff00) >> 8
。只有 8 位的原因是历史原因:在原始 unix [为 PDP-11 开发] 下,int
是 16 位,因此在status
中没有空间为wait
提供更大的错误代码。为了向后兼容,错误代码的大小没有增加,尽管现在大多数拱门将int
定义为 32 位实体。如前所述,由于程序返回的代码通过操作系统并由父级从系统调用中获取,因此它取决于操作系统类型
@CraigEstey 有趣,谢谢!事实上,我在“unix 操作系统的设计”中发现了一条注释,解释了传递给exit()
的低 8 位存储在内部进程返回码的第 8 到 15 位中,如您所说。我想这就是为什么从wait()
获得的返回码必须用WIFEXITED()
、WEXITSTATUS()
等正确解释的原因......而system()
的返回也是如此。
感谢@HansPassant 的更新。事实上exit()
的 Windows 文档说“状态的低位字节可供主机环境使用”,但测试表明始终返回完整整数,正如您所说关于GetExitCodeProcess()
。即使使用旧版execlp()
,也会发生这种情况。所以似乎没有“仅”这个词被解释为“最低字节或更多”:-)以上是关于为啥超过 255 的返回码在 C++ 中返回不同的数字?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 tinyint 在 MySQL 中不能存储超过 255 的数字?