转载自:http://www.eefocus.com/article/09-10/85481s.html (Linux C编程一站式学习 )
main函数最标准的原型应该是int main(int argc, char *argv[]),也就是说启动例程会传两个参数给main函数,这两个参数的含义我们学了指针以后再解释。我们到目前为止都把main函数的原型写成 int main(void),这也是C标准允许的,如果你认真分析了上一节的习题,你就应该知道,多传了参数而不用是没有问题的,少传了参数却用了则会出问题。
由于main函数是被启动例程调用的,所以从main函数return时仍返回到启动例程中,main函数的返回值被启动例程得到,如果将启动例程表示成等价的C代码(实际上启动例程一般是直接用汇编写的),则它调用main函数的形式是:
也就是说,启动例程得到main函数的返回值后,会立刻用它做参数调用exit函数。exit也是libc中的函数,它首先做一些清理工作,然后调 用上一章讲过的_exit系统调用终止进程,main函数的返回值最终被传给_exit系统调用,成为进程的退出状态。我们也可以在main函数中直接调 用exit函数终止进程而不返回到启动例程,例如:
这样和int main(void) { return 4; }的效果是一样的。在Shell中运行这个程序并查看它的退出状态:
按照惯例,退出状态为0表示程序执行成功,退出状态非0表示出错。注意,退出状态只有8位,而且被Shell解释成无符号数,如果将上面的代码改为exit(-1);或return -1;,则运行结果为
注意,如果声明一个函数的返回值类型是int,函数中每个分支控制流程必须写return语句指定返回值,如果缺了return则返回值不确定(想想这是 为什么),编译器通常是会报警告的,但如果某个分支控制流程调用了exit或_exit而不写return,编译器是允许的,因为它都没有机会返回了,指 不指定返回值也就无所谓了。使用exit函数需要包含头文件stdlib.h,而使用_exit函数需要包含头文件unistd.h,以后还要详细解释这 两个函数。