exit函数:定义在C标准库stdlib.h中;当我们调用exit(0)时,表示正常退出当前进程,当我们调用eixt(1)时表示非正常退出当前进程。
_exit函数:定义在unistd.h中;直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit() 函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
exit()函数在调用
exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O缓冲"。
用一张图来表示:
exit()在结束调用它的进程之前,要进行如下步骤:
1.调用atexit()注册的函数(出口函数)
atexit()函数定义在stdlib中,它的函数定义为:int atexit(void (*)(void)),形参为一个返回值为void,参数为void的函数指针。
在一个程序中最多可以用atexit()注册32个处理函数,按atexit注册时相反的顺序调用处理函数(先被注册的后调用),这使得我们可以指定在程序终止时执行自己的清理动作。
void FunExit1() { printf("FunExit1 run\n"); } void FunExit2() { printf("FunExit2 run\n"); } int main() { atexit(FunExit1); atexit(FunExit2); exit(0); return 0; }
运行结果:
2.调用cleanup()关闭所有的流
这一步操作导致所有的缓冲被输出。
3. 最后调用_exit()函数终止进程
_exit()函数主要做了清理内存空间,结束进程调用等工作。
exit函数在结束进程时用cleanup()刷新了缓冲区,使缓冲区中的数据被输出,而_exit函数只是exit函数中的一部分,它调用了系统调用函数exit()。