Linux / bash中程序返回值的有效范围是多少?

我有一个C程序,它返回一个整数值。 我很惊讶地发现,当从shell提示符检查返回值时,我得到的值为模数256。

/* prog.c */ int main(...) { return 257; } 

 > ./prog.e > echo $? 1 
  • 为什么我看不到整数?
  • 这种行为记录在哪里?
  • 如何将整个32位值获取到shell?

当程序退出时,它可以使用退出状态向父进程返回有关终止原因的少量信息。 这是一个0到255之间的值,退出进程作为退出参数传递。

http://www.gnu.org/s/hello/manual/libc/Exit-Status.html

或者:

http://en.wikipedia.org/wiki/Exit_status

来自“posix返回代码”和“c返回代码”各自的Google搜索。

解释就在man exit的顶部:

    exit()函数导致正常的进程终止和值
    status&0377返回给父级(参见wait(2))。

换句话说,只有最低8位传播到父进程。

在这方面,从main()返回退出代码与将其传递给exit()没有什么不同。

wait和相关的系统调用中解释返回状态(类型)。

基本上:

WEXITSTATUS(stat_val)
如果WIFEXITED(stat_val)的值不为零,则此宏计算为子进程传递给_exit()或exit()的status参数的低8位 ,或子进程从main返回的值()。

所以它限制在8位。 你无法获得更多。 (使用Linux内核2.6.9及更高版本,waitid(2)可用于获取完整的32位。)