【问题标题】:Why can't I return bigger values from main function?为什么我不能从主函数返回更大的值?
【发布时间】:2011-04-13 15:25:28
【问题描述】:

我试图从我的主函数返回一个更大的值,比如 1000,但是当我输入 echo $? 时它显示 0。

如果我返回一个较小的值,比如 100,它会显示正确的值。

我的代码:

int main(void)
{
     return 1000;
}

我们可以返回的值有什么限制吗?

【问题讨论】:

  • return 1000; 得到 232return 1001; 得到 233

标签: c++ linux exit-code


【解决方案1】:

这里有两个相关的概念:C 退出状态和 bash 返回码。它们都涵盖了 0-255 的范围,但 bash 出于自己的目的使用高于 126 的数字,因此从您的程序中返回这些数字会令人困惑。

为了安全起见,将退出状态代码限制为 0-127,因为这是最便携的,至少 http://docs.python.org/library/sys.html#sys.exit 暗示了这一点。

C 退出状态放入 bash $?执行后变量,但 bash 使用 127 表示“找不到命令”,因此您可能希望避免这种情况。 Bash reference page.

Bash 还使用 128-255 作为信号 - 它们表明进程被信号杀死: exit code = 128 + signal number。因此,您或许可以避免使用接近 255 的数字,因为信号数字不太可能达到那么高。

除了这些通用指南之外,还有许多尝试定义不同数字的含义:http://tldp.org/LDP/abs/html/exitcodes.html

因此,如果您想从程序中返回任意整数,最好将其打印到标准输出,然后使用 bash 脚本中的VALUE=$(program) 捕获它。

【讨论】:

  • 我相信*NIX系统上的范围是0-255(即uint8_t的范围)——不熟悉最大值为127的任何系统(这意味着有符号的返回类型相当于int8_t,但这也意味着下限为-128。)
  • 除了告诉不正确的范围(如@Jonathan 所述),您似乎还混淆了程序退出状态(如waitpid(2) 报告)和shell 命令退出状态(如$? 报告)。 “128-255 用于信号”仅适用于后者。
【解决方案2】:

main 的返回值(即应用程序的退出状态)在 *NIX 上被限制在 [0, 255] 范围内。 1000 超出范围,操作系统将其视为 0,大概。

【讨论】:

  • 不,至少在 bash 中,大于 255 的退出状态返回模 256 的值。1000 将返回 232
  • 根据 C 处理数字的方式,这就是我的假设,但 OP 说他的结果是 0。
【解决方案3】:

在 Unix 领域,main 的返回值是有限的,因为 exit 被限制在 8 位字节的范围内。

在 Windows 中,只有一个值 STILL_ACTIVE,其值为 259,最好避免将其作为进程退出代码。

除此之外,在 Windows 中,您可以返回 32 位代码,例如 HRESULT,这通常是这样做的。

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多