例如...
#include <iostream>
using namespace std;
int main(){return 300;}
返回:
Process finished with exit code 44
??
EXIT_SUCCESS
(或零) 和 EXIT_FAILURE
:
因此,并不保证任何其他整数都会按原样返回。3.6.1/5 main函数中的返回语句会使main函数结束(销毁任何自动存储期限的对象),并将返回值作为参数调用
std::exit
。18.5/8 (...) 最后,控制权返回给主机环境。如果状态是零或
EXIT_SUCCESS
,则返回一个实现定义的状态成功终止的形式。如果状态是EXIT_FAILURE
,则返回一个实现定义的状态不成功终止的形式。否则,返回的状态是实现定义的。
GetExitCodeProcess()
函数返回整数值,因此您将获得300。(status & 0xff00) >> 8
。之所以只有8个位数是出于历史原因:在最初的Unix [开发于PDP-11]下,一个“int”是16位,因此wait
中的“status”没有更大的错误代码空间。为了向后兼容,即使现在大多数体系结构都将“int”定义为32位实体,错误代码的大小也没有增加。正如提到的那样,由程序返回的代码通过操作系统传递,并由父进程从syscall中获取,因此它取决于操作系统类型。 - Craig Esteyexit()
的低8位存储在内部进程返回代码的位8到15中,就像你说的那样。我想这就是为什么必须使用 WIFEXITED()
、WEXITSTATUS()
等正确解释从 wait()
获得的返回代码的原因...同样也适用于 system()
的返回值。 - Christopheexit()
的说明是:“状态的低字节可用于主机环境”,但测试结果表明,总是返回完整的整数,就像您在使用 GetExitCodeProcess()
时所述一样。即使使用传统的 execlp()
也会发生这种情况。因此,似乎应将缺少单词“only”解释为“最低字节或更多” :-) - Christophe
300&0xff == 44
。 很确定这主要是Unix的东西。请参见waitpid
手册中的WEXITSTATUS
-状态被OR到其他一些值中。 - asveikau