首先我们了解下atexit函数:
函数名:atexit 头文件:#include 功 能 : 注册终止函数(即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
#include
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()函数需要执行清理处理,需要执行一系列的操作,这些终止处理函数实际上就是完成各种所谓的清除操作的实际执行体。