在C程序中,如果我们想从终端提供一些输入,那么我们可以通过以下方式给出:
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)
同样,如果我们想获得main()函数的返回值,那么我们如何才能得到它?
在每个main()我们写return 1或return 0; 我怎么知道我main()在码头回来了什么?
编辑:1
我得到它,因为echo $?我们可以获得返回值,main()但它只允许我成功返回小于125(在Linux中)的值.不止于此返回值不能被成功地接收到$ variable这样
为什么int回归类型main()?为什么不保留它short int?
EDIT2
如果main()返回大于125的值,我在哪里可以找到错误代码的含义?
CB *_*ley 50
大多数shell存储上一个运行命令的退出代码,$?以便您可以存储或显示它.
$ ./a.out
$ echo $? # note - after this command $? contains the exit code of echo!
Run Code Online (Sandbox Code Playgroud)
要么
$ ./a.out
$ exit_code=$? # save the exit code in another shell variable.
Run Code Online (Sandbox Code Playgroud)
请注意,在linux下,虽然您返回一个int,但通常只有小于126的值可以安全使用.保留较高的值以记录在尝试运行命令时可能发生的其他错误,或记录哪个信号(如果有)终止程序.
sid*_*yll 40
你的shell可能有一个特殊的变量$?,它保存最后一个程序的返回值.因此,在程序完成后不久,您可以运行:
echo $?
Run Code Online (Sandbox Code Playgroud)
查看返回的值.
pmg*_*pmg 31
在DOS/Windows中,您可以errorlevel在批处理文件中使用
executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...
Run Code Online (Sandbox Code Playgroud)
只记得检查从最大到最低,因为if errorlevel 42真的意味着"如果errorlevel是42或更高"
小智 6
总结评论和点点滴滴,使它们在一个地方.
AC程序总是有退出代码,如果程序正常终止,程序可以通过返回main函数的值或通过调用exit函数来自行决定退出代码.如果程序异常终止,例如通过分段错误,则操作系统决定退出代码.
在Unix(Posix)中,退出代码是一个8位值:0-255.它与一些其他元数据结合到一个状态:其他元数据包括有关程序是否正常终止的信息,是否由于信号而终止,如果是,则返回哪个信号.有关详细信息,请参阅wait(2)手册页.
在Unix中,在shell中,可以访问上一个命令的状态作为$?特殊变量.因为退出代码只有8位,并且它被视为无符号整数,如果返回负值,它将变为正数:-1变为255.同样,如果返回的值大于255,则只有最小值使用有效8位:256变为0.
返回类型main是int,而不是,short或char因为没有特别的好处使它成为一个较小的类型,特别是在历史的这一点,几十年后决定.现在更改它只会导致不必要的并发症.
如果要从C执行程序,标准库提供了该system函数,可以方便地返回程序的状态.(请注意,system通过shell运行命令,如果在命令行上为命令提供任何外部提供的文件名或其他内容,则需要非常小心地正确转义所有内容.)
对于更多的灵活性,你可以执行使用系统调用其他程序fork,execl(或其变体之一,看到EXEC(3)手册页),和wait(上面已经提到).这是强大而灵活的,但也很容易出错,所以一定要先阅读文档并查看一些示例程序.(另一方面,学习这些东西非常有趣.)