C语⾔中exit()与return的区别
整理⾃
1、exit函数和return函数的主要区别是:
1)exit⽤于在程序运⾏的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调⽤exit函数。exit函数运⾏时⾸先会执⾏由atexit()函数登记的函数,然后会做⼀些⾃⾝的清理⼯作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时⽂件。exit是结束⼀个进程,它将删除进程使⽤的内存空间,同时把错误信息返回⽗进程;⽽return是返回函数值并退出函数。通常情况:exit(0)表⽰程序正常, exit(1)和exit(-1)表⽰程序异常退出,exit(2)表⽰表⽰系统不到指定的⽂件。在整个程序中,只要调⽤exit 就结束(当前进程或者在main时候为整个程序)。
2)return是语⾔级别的,它表⽰了调⽤堆栈的返回;return( )是当前函数返回,当然如果是在主函数main, ⾃然也就结束当前进程了,如果不是,那就是退回上⼀层调⽤。在多个进程时。如果有时要检测上个进程是否正常退出。就要⽤到上个进程的返回值,依次类推。⽽exit是系统调⽤级别的,它表⽰了⼀个进程的结束。
3)exit函数是退出应⽤程序,并将应⽤程序的⼀个状态返回给OS,这个状态标识了应⽤程序的⼀些运⾏信息。
4)和机器和操作系统有关的⼀般是: 0为正常退出,⾮0为⾮正常退出;
2、进程环境与进程控制
exit(int n)其实就是直接退出程序,因为默认的标准程序⼊⼝为 int main(int argc, char** argv),返回值是int型的。⼀般在shell下⾯,运⾏⼀个程序,然后使⽤命令echo $?就能得到该程序的返回值,也就是退出值,在main()⾥⾯,你可以⽤return n,也能够直接⽤exit(n)来做。unix默认的正确退出是返回0,错误返回⾮0。理论上exit可以返回⼩于256的任何整数。返回的不同数值主要是给调⽤者作不同处理的。
单独的进程是返回给操作系统的。如果是多进程,是返回给⽗进程的。⽗进程⾥⾯调⽤waitpid()等函数得到⼦进程退出的状态,以便作不同处理。根据相应的返回值来让调⽤者作出相应的处理。总的说来,exit()就是当前进程把控制权返回给调⽤该程序的程序,括号⾥的是返回值,告诉调⽤程序该程序的运⾏状态。
1)进程的开始:
C程序是从main函数开始执⾏,原型如下:int main(int argc, char *argv[]);通常main的返回值是int型,正确返回0。如果main的返回值为void,某些编译器会给出警告,此时main的返回值通常是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>
return在c语言中是什么意思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;
}
运⾏结果:
$ ./a.out
main is done
first exit handler
first exit handler
second exit handler
注意上⾯的结果,可以发现这些函数由exit按登记相反的顺序⾃动调⽤(先myexit1后myexit2)。如果同⼀函数登记多次, 也会被调⽤多次(如这⾥的myexit1)。程序退出的时候利⽤atexit函数调⽤了这些处理函数。但是如果⽤_exit()退出程序,则它不关闭任何⽂件,不清除任何缓冲器、也不调⽤任何终⽌函数!