在C语言中,经常会遇到使用exit函数直接结束程序运行的情况,exit和return的作用有些类似,特别是在main函数中出现时,经常令人迷惑:是该用exit还是return?或是随便用哪一个都行?二者到底有何区别?
1.exit用于在程序运行的过程中随时结束、终止程序,exit的参数是返回给OS的。main函数结束时(使用return或exit)也会隐式(即自动)地调用exit函数。
exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值(可选,void类型的函数只return而不带值)并退出函数。
2.return是语言级别的,它表示了调用堆栈的返回,即返回主调函数;而exit是系统调用级别的,它表示了一个进程的结束。
3.exit的函数原型为“void exit( int status );”,其作用是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息:和机器和操作系统有关一般是 0 为正常退出、非0为非正常退出且不同的取值表示不同的退出原因(具体含义用程序设计者确定并在程序的使用手册中说明)。
4.atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:“int atexit( void (*func)(void) );”。在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。
一般程序执行到 main() 的结束就完成了, 如果想让程序在结束时做一些统一的事情(自己安排的收尾工作), 可以尝试着用以下的例子去看看效果:
#include <stdio.h>
#include <stdlib.h>
void f1(void) { printf("exit f1\n"); }
void f2(void) { printf("exit f2\n"); }
int main(void)
{
atexit(f1); atexit(f2); printf("exit main\n");
return 0;
}
5.在main函数里面return(0)和exit(0)的作用是一样的。在main函数中我们通常使用“return (0);”这样的方式返回一个值,但这是限定在非“void main()”这样的形式。
exit()通常是用在子程序(函数)中用来终结程序用的(发生了程序认为无法继续运行下去的情况,程序设计者认为此时应当终止程序运行,此时只能使用exit,因为使用retrurn的结果是返回主调函数,达不到终止程序运行的目的),使用exit后程序自动结束并返回操作系统。
把exit用在main函数内的时候,无论main是否定义成void返回的值都是有效的,并且exit不需要考虑类型,exit(1)等价于return (1)。
|