1 、 exit 函数和 return 函数的主要区别是:
1 ) exit 用于在程序运行的过程中随时结束程序, 其参数是返回给 OS 的 。也可以这么讲: exit 函数是退出应用程序 , 并将应用程序的一个状态返回给 OS ,这个状态标识了应用程序的一些运行信息。
main 函数结束时也会隐式地调用 exit 函数, exit 函数运行时首先会执行由 atexit() 函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准 I/O 函数 tmpfile() 创建的临时文件。
exit 是系统调用级别的, 它表示了一个进程的结束, 它将删除进程使用的内存空间,同时把错误信息返回父进程。通常情况: exit(0) 表示程序正常 , exit(1) 和 exit(-1) 表示程序异常退出, exit(2) 表示系统找不到指定的文件。
2 ) return 是语言级别的, 它表示了调用堆栈的返回; return 是返回函数值并退出函数,通常 0 为正常退出,非 0 为非正常退出,请注意,如果是在主函数 main, 自然也就结束当前进程了( 也就是说,在 main() 里面,你可以用 return n ,也能够直接用 exit(n) 来做 ), 如果不是在 main 函数中,那就是退回上一层调用。 在多个进程时,如果有时要检测上个进程是否正常退出,就要用到上个进程的返回值。
2 、进程环境与进程控制
如果 exit(int n) 是在 main 函数里被调用的,那么 exit(int n) 就直接退出程序,并返回一个 int 型的值。一般在 shell 下面,运行一个程序,然后使用命令 echo $? 就能得到该程序的返回值,也就是退出值。 理论上 exit 可以返回小于 256 的任何整数,返回的不同数值主要是给调用者作不同处理的。
对于单独的进程 exit 的返回值是返回给操作系统的, 但如果是多进程,则是返回给父进程的。 父进程里面调用 waitpid() 等函数得到子进程退出的状态,以便作不同处理。根据相应的返回值来让调用者作出相应的处理。
总的说来, exit ( int n )就是当前进程把其控制权返回给调用该子程序的主程序 , 括号里的是返回值 , 告诉调用程序该程序的运行状态。
1 )进程的开始:
C 程序是从 main 函数开始执行 , 原型如下 : int main(int argc, char *argv[]); 通常 main 的返回值是 int 型 , 正确返回 0 。
2 )进程终止:
C 程序的终止分为两种 : 正常终止和异常终止 。
正常终止分为 : return, exit, _exit, _Exit, pthreade_exit 。
异常中指分为 : abort, SIGNAL, 线程响应取消 。
主要说一下正常终止的前 4 种 , 即 exit 系列函数 .
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
以上 3 个函数的区别是 :
exit()( 或 return 0) 会调用终止处理程序 和用户空间的标准 I/O 清理程序 ( 如 fclose), 而 _exit 和 _Exit 不调用而直接由内核接管进行清理 。 因此 , 在 main 函数中 exit(0) 等价于 return 0.
3 ) atexit 终止处理程序:
ISO C 规定 , 一个进程最多可登记 32 个终止处理函数 , 这些函数由 exit 按 登记相反的顺序 自动调用。 如果同一函数登记多次 , 也会被调用多次。
原型如下 :
#include <stdlib.h>
int atexit(void (*func)(void));
其中参数是一个函数指针 , 指向终止处理函数 , 该函数 无参无返回值 。 atexit 函数本身成功调用后返回 0 。
以下面的程序为例 :
#include <stdlib.h>
static void myexit1()
{
printf("first exit handler/n");
}
static void myexit2()
{
printf("second exit handler/n");
}
int main()
{
atexit(my_exit2) ;
atexit(my_exit1) ;
atexit(my_exit1) ;
printf("main is done/n");
return 0; // 相当于 exit(0)
}
运行结果 :
$ ./a.out
main is done
first exit handler
first exit handler
second exit handler
main 函数结束时也会隐式地调用 exit 函数, exit 函数运行时首先会执行由 atexit() 函数登记的函数,然后会做一些自身的清理工作,同时 刷新所有输出流 、 关闭所有打开的流 并且 关闭通过标准 I/O 函数 tmpfile() 创建的临时文件 。
注意上面程序的结果,可以发现这些函数由 exit 按登记相反的顺序自动调用(先 myexit1 后 myexit2 )。 如果同一函数登记多次 , 也会被调用多次(如这里的 myexit1 )。
而这些处理函数都是在程序退出的时候利用 atexit 函数调用了这些处理函数。但是如果用 _exit() 退出程序,则它不关闭任何文件,不清除任何缓冲器、也不调用任何终止函数!
原文出处:http://zqwt.012.blog.163.com/blog/static/1204468420105198615886/