exit()和_exit()的区别

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()。

猜你喜欢

转载自blog.csdn.net/shimadear/article/details/80380905
今日推荐