主函数的返回值范围

时间:2011-03-01 00:29:38

标签: c posix c99 exit-code

主要回报值范围的标准说明是什么? 最多只说255?

因为

int main(void){
return 256;
}
echo $? ;  # out 0

7 个答案:

答案 0 :(得分:18)

标准没有说。 0EXIT_SUCCESSEXIT_FAILURE具有(某种)指定的含义。其他任何事情都取决于实施。

目前,大多数基于Unix的系统仅支持8位返回值。 Windows支持(至少)32位返回值。我没有检查64位Windows是否支持64位返回值,但我对此表示怀疑,因为即使是64位Windows通常仍然使用32位int。

答案 1 :(得分:14)

正如其他人所说,C&除了声明(1)main返回int(具有实现定义的大小)和(2)零(或{{1})之外,C ++标准不会约束返回值。 })是成功的返回,EXIT_SUCCESS是非成功的返回。它确实指定明确不返回值的EXIT_FAILURE被视为返回零。

在这种情况下,返回值的解释取决于等待流程完成的流程(通过调用waitwaitpidwaitid)。 waitwaitpid是较旧的POSIX函数,它们仅指定the least significant eight bits of the return value shall be available to a waiting parent process。 POSIX:2008标准添加了waitid作为通用等待方法,可以访问子进程的完全退出状态。

在分离子进程之后,另一个进程调用其中一个 wait 函数进入休眠状态,直到分叉进程完成(例如,从main返回,调用mainexit或其他)。 waitwaitpid函数通过指向整数的指针返回 status 。调用者使用abortWIFEXITED(status_val)宏提取实际退出状态。后者由POSIX定义,并且需要返回the low-order 8 bits of the status argumentwaitid函数使用指向WEXITSTATUS(status_val)结构的指针来返回进程的状态信息。 siginfo_t成员包含Status Information中描述的完整状态值。

基本上,退出状态的值位于旁观者的眼中。 ANSI / ISO规范是开放式的。 POSIX套件有多种方法可以等待进程完成并获取其退出状态。 POSIX还将spawn定义为si_status的轻量级版本,它对退出状态值有自己的一组约束。 Shell有习惯进一步限制结果值 - GNU's bash将返回状态限制为7位,将POSIX-compliant shell限制退出状态值限制为8位。 FWIW,大多数人同意将您的返回值限制为lower than 64 seems to be safe

答案 2 :(得分:4)

退出代码是Unix类似系统的0到255之间的数字。您可以返回任何内容,但在Linux中它已修改为256.请查看here以获得有关Linux返回代码的详细说明。还有一个Wikipedia article on the topic,它简单地讨论了Windows的退出代码。

答案 3 :(得分:3)

C标准不对退出代码施加特殊限制,关于main代表返回值的段落关于exit()函数的文档,后者反过来说:

  

如果status的值为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。如果status的值为EXIT_FAILURE,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。

除了EXIT_SUCCESS / EXIT_FAILURE指南之外,

基本上意味着“做你想做的事”。 :)

正如在一篇评论中所说,在POSIX系统上只实际考虑退出代码的低8位只是一种UNIX主义,这源于wait系统调用的设计方式(退出状态必须被打包在wait返回值的低8位,并且与C标准无关。

反例是Windows,其中考虑了传递给exit / return的整个值(只要它不大于DWORD 1 ,但我不认为它们会使int大于DWORD,它会破坏很多代码。)

<小时/> 1.因为为返回此值而保留的GetExitCodeProcess参数为DWORD *

答案 4 :(得分:2)

  

在Unix上,等待系统调用设置了一个   int类型的状态值打包为   与各种类型的孩子的位域   终止信息。如果孩子   退出终止(已确定   由WIFEXITED宏;通常   替代方案是它死于一个   未指定信号),SUS指定   状态值的低8位   包含退出状态;这个可以   使用WEXITSTATUS检索   在wait.h中的宏。因此,在Unix上   退出状态仅限于值    0-255 ,无符号8位的范围   整数。

     类似Unix的系统通常使用   成功与否的惯例   零错误。一些惯例   已经发展了亲戚   各种错误代码的含义;对于   示例GNU建议使用代码   高位设置保留   严重的错误,和FreeBSD有关   记录了一整套   首选解释。

C99标准仅定义0和1.但是,允许使用其他值。

有关详情,请参阅Exit Status wiki。

答案 5 :(得分:0)

您返回类型int。您应该能够返回可以存储在int中的任何值。 int的确切大小取决于实现,因此我无法给出确切的范围。

答案 6 :(得分:0)

  

5.1.2.2.3程序终止1如果主函数的返回类型是a   类型与int兼容,返回   从最初的电话到主要   函数相当于调用   退出函数的退出函数   以主函数为参数;   10)到达终止的   main函数返回值0.如果   返回类型不兼容   int,返回终止状态   到主机环境是未指定的

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

即,没有要求它返回任何东西。然而,它强烈地说明了通常的定义是什么。几乎暗示他们是标准的,但有一个免于监狱的卡,这意味着它可以是任何东西。