请考虑以下代码:
#include <stdio.h>
int main()
{
int x;
printf ("\nEnter x: ");
scanf ("%d", &x);
return x;
}
Output:
$Enter x: -2
$echo $?
254
我的问题是:
操作系统通过执行进程 P(上面正在执行的代码)知道 main() 的返回值是非零的。
在这种情况下,操作系统是否会进行任何处理?
请考虑以下代码:
#include <stdio.h>
int main()
{
int x;
printf ("\nEnter x: ");
scanf ("%d", &x);
return x;
}
Output:
$Enter x: -2
$echo $?
254
我的问题是:
操作系统通过执行进程 P(上面正在执行的代码)知道 main() 的返回值是非零的。
在这种情况下,操作系统是否会进行任何处理?
返回值实际上表示程序完成的状态。非零值表示程序已异常终止。该状态可能被其他程序使用,因此返回实际状态始终是一个好习惯。
这里的“操作系统”必须清楚你所理解的。
如果您从 shell 的角度来看(这通常只是另一个用户空间程序,而不是内核本身的一部分),进程的退出值用于评估表达式的值,并且在执行 shell 时很重要编程,因为它是进程终止后最自然的检查。
从内核的角度来看,进程的退出值在很大程度上被忽略了。内核必须在进程之后进行清理,无论它返回的退出代码如何。
通常,当程序“按预期”执行时,我们返回 0。如果它执行了不应该执行的操作,则根据错误类型返回非零值(对此您可以参考 errno 手册)。现在这个返回值被程序运行的“shell”接收。可以使用“$?”访问此返回值 在 BASH 中。所以它纯粹是为了用户对程序的可访问性(它运行正确,如果不是什么错误)。然后,此返回值可用于 shell 脚本等,以决定是否重新运行或管理员想要执行的任何操作。内核只是清理用户级程序。