atexit函数的用法

首先我们了解下atexit函数:

函数名:atexit
头文件:#include<stdlib.h>
功 能 : 注册终止函数(即main执行结束后调用的函数)
原型 : void atexit(void (*func)(void));
说明:atexit()用来设置一个程序正常结束前调用的函数. 当程序通过调用exit()或从main 中返回时, 参数function 所指定的函数会先被调用, 然后才真正由exit()结束程序。
调用顺序: 在atexit(f)调用之前被静态分配的对象的析构函数将在f()的调用之后被调用。在一个atexit(f)调用之后建立的这种对象的析构函数将在f的调用之前被调用。引自《The C++ Programming Language》(Bjarne Stroustrup)。

进程终止的方法有8种,如下所示,其中前5种是正常的方法,后面的3种方法是异常终止。

  • 从 main 返回
  • 调用 exit
  • 调用 _exit 或 _Exit
  • 最后一个线程从其启动例程返回
  • 最后一个线程调用pthread_exit
  • 调用 abort
  • 接到一个信号并终止
  • 最后一个线程对取消请求做出响应

下面看下atexit函数的作用例子:

#include<iostream>
#include<stdlib.h>
using namespace std;

int atexit(void (*function)(void));

void func1(void), func2(void), func3(void);

int main(int argc, char* argv[])
{
	
	atexit(func1);
	atexit(func2);
	atexit(func3);
	cout << "this is main..." << endl;
	
	//exit(0);
	
	//_exit(0);
	
	//_Exit(0);
	
	return 0;	
}

void func1()
{
	cout << "func1..." << endl;
}

void func2()
{
	cout << "func2..." << endl;
}

void func3()
{
	cout << "func3..." << endl;
}

运行上面的程序:
在这里插入图片描述
发现:首先在main函数返回(return 0;)之后,程序还在继续运行,并且执行的顺序和我们在main函数中登记的顺序是相反的。

然后我们分别执行main函数中的exit()、_exit()、 _Exit() 函数来终止进程,发现,执行exit()时程序的运行效果跟上面的运行效果是一致的,而_exit()、 _Exit() 的执行结果如下所示:
在这里插入图片描述
上面的两种不同的结果,说明:
exit()和_exit()以及_Exit()函数的本质区别是是否立即进入内核,_exit()以及_Exit()函数都是在调用后立即进入内核,而不会执行一些清理处理,但是exit()则会执行一些清理处理,这也是为什么会存在atexit()函数的原因,因为exit()函数需要执行清理处理,需要执行一系列的操作,这些终止处理函数实际上就是完成各种所谓的清除操作的实际执行体。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章