【问题标题】:What Happens when main() function does not return zero当 main() 函数不返回零时会发生什么
【发布时间】:2012-11-06 07:18:15
【问题描述】:

请考虑以下代码:

#include <stdio.h>

int main()
{
    int x;
    printf ("\nEnter x: ");
    scanf ("%d", &x);

    return x;
}

Output:
$Enter x: -2

$echo $?
254

我的问题是:

操作系统通过执行进程P(上面正在执行的代码)知道main()的返回值是非零的。

操作系统在这种情况下会做任何处理吗?

【问题讨论】:

    标签: c operating-system


    【解决方案1】:

    这里的“操作系统”要说清楚你所理解的。

    如果您从 shell 的角度来看(无论如何它通常只是另一个用户空间程序,而不是内核本身的一部分),进程的退出值用于评估表达式的值,并且很重要在进行 shell 编程时,因为它是进程终止后最自然的检查。

    从内核的角度来看,进程的退出值在很大程度上被忽略了。无论进程返回什么退出代码,内核都必须在进程结束后进行清理。

    【讨论】:

      【解决方案2】:

      返回值实际上表示程序完成的状态。非零值表示程序已异常终止。该状态可能会被其他程序使用,因此最好返回实际状态。

      【讨论】:

      • 你有点过于简单化了。为main的返回定义了三个值:0EXIT_SUCCESSEXIT_FAILURE,其中前两个表示程序成功。所有其他值的解释都是“实现定义的”。例如,在 Linux 上,所有 256 的倍数都表示成功,因为它只查看返回值的低位。
      • 感谢@JensGustedt 的更多澄清
      【解决方案3】:

      通常,当程序“按预期”执行时,我们返回 0。如果它执行了不应该执行的操作,我们根据错误类型返回非零(有关此,您可以参考 errno 手册)。现在这个返回值被程序运行的“shell”接收。可以使用“$?”访问此返回值在 BASH 中。所以它纯粹是为了用户对程序的可访问性(它运行正确,如果不是什么错误)。然后,此返回值可用于 shell 脚本等,以决定是否重新运行或管理员想要执行的任何操作。 内核只是清理用户级程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        相关资源
        最近更新 更多