在Linux中函数的退出有以下8种情况,其中前5种为正常情况,后3种为异常情况
1 从main函数返回;
2 调用exit函数;
3 调用_exit或_Exit;
4 最后一个线程从启动例程返回;
5 最后一个线程调用pthread_exit;
6 调用abort函数;
7 接到一个信号并终止;
2 调用exit函数;
3 调用_exit或_Exit;
4 最后一个线程从启动例程返回;
5 最后一个线程调用pthread_exit;
6 调用abort函数;
7 接到一个信号并终止;
8 最后一个线程对取消请求做出响应
exit:#include<stdlib.h>
_exit:#include<unistd.h>
_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
exit()函数与_exit()函数最大的区别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。
exit()函数示例:
代码:
int main() { printf("hello world!\n"); sleep(2); exit(123); }
_exit()函数示例:_exit没有刷新缓冲区
代码:
int main() { printf("hello world!"); sleep(2); _exit(123); }
atexit函数函数名: atexit
头文件:#include<stdlib.h>功 能: 注册终止函数(即main执行结束后调用的函数)用 法: int atexit(void (*func)(void));在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。
以下程序验证以下atexit函数的调用顺序:
1 #include<stdio.h> 2 #include<sys/stat.h> 3 #include<sys/types.h> 4 #include<fcntl.h> 5 #include<stdlib.h> 6 #include<unistd.h> 7 #include<string.h> 8 void fun1() 9 { 10 printf("i am fun1\n"); 11 } 12 void fun2() 13 { 14 printf("i am fun2\n"); 15 } 16 void fun3() 17 { 18 printf("i am fun3\n"); 19 } 20 void fun4() 21 { 22 printf("i am fun4\n"); 23 } 24 void fun5() 25 { 26 printf("i am fun5\n"); 27 } 28 int main() 29 { 30 atexit(fun1); 31 atexit(fun2); 32 atexit(fun3); 33 atexit(fun4); 34 atexit(fun5); 35 exit(0); 36 }