exit()和abort()有什么区别?

在C和C ++中, exit()abort()什么区别? 我想在发生错误(不是例外)后结束我的程序。

abort()退出你的程序,不用先调用使用atexit()注册的函数,也不先调用对象的析构函数。 exit()在退出程序之前都执行。 它不会为自动对象调用析构函数。 所以

 A a; void test() { static A b; A c; exit(0); } 

将会正确地破坏ab ,但不会调用c析构函数。 abort()不会调用这两个对象的析构函数。 由于这是不幸的,C ++标准描述了一个确保正确终止的替代机制:

具有自动存储持续时间的对象在函数main()包含自动对象并执行对exit()的调用的程序中全部销毁。 通过抛出一个在main()捕获的exception,控制可以直接传递给这样一个main()

 struct exit_exception { int c; exit_exception(int c):c(c) { } }; int main() { try { // put all code in here } catch(exit_exception& e) { exit(ec); } } 

而不是调用exit() ,安排该代码throw exit_exception(exit_code); 代替。

中止发送一个SIGABRT信号, 退出只是closures执行正常清理的应用程序。

您可以处理中止信号,但是默认行为是closures应用程序以及错误代码。

中止不会执行你的静态和全局成员的对象销毁,但退出将会。

当然,当应用程序完全closures时,操作系统将释放任何未经确认的内存和其他资源。

中止退出程序终止(假设你没有重写默认行为),返回代码将返回到启动你的应用程序的父进程。

看下面的例子:

 SomeClassType someobject; void myProgramIsTerminating1(void) { cout<<"exit function 1"<<endl; } void myProgramIsTerminating2(void) { cout<<"exit function 2"<<endl; } int main(int argc, char**argv) { atexit (myProgramIsTerminating1); atexit (myProgramIsTerminating2); //abort(); return 0; } 

注释:

  • 如果放弃注释:没有打印任何对象的析构函数将不会被调用。

  • 如果中止评论像上面:someobject析构函数将被调用,你会得到以下输出:

退出function2
退出function1

程序调用exit ()时会发生以下情况:

  • 执行由atexit函数注册的函数
  • 所有打开的stream都被刷新并closures,由tmpfile创build的文件被删除
  • 程序以指定的退出码结束到主机

abort ()函数将SIGABRT信号发送到当前进程,如果没有捕获到程序被终止,不保证打开的stream被刷新/closures或者通过tmpfile创build的临时文件被删除,不会调用已注册的函数,并将非零退出状态返回给主机。

从exit()手册页:

exit()函数会导致正常的进程终止,并且状态&0377的值被返回给父进程。

从abort()手册页:

abort()首先放开SIGABRT信号,然后提升调用进程的信号。 这会导致进程exception终止,除非SIGABRT信号被捕获并且信号处理程序不返回。

abort发送SIGABRT信号。 abort不返回给调用者。 SIGABRT信号的默认处理程序closures应用程序。 stdio文件stream被刷新,然后closures。 C ++类实例的析构函数不是(不确定这个 – 也许结果是不确定的?)。

exit有它自己的callback,设置为atexit 。 如果指定了callback(或者只有一个callback),则按照其注册顺序(如堆栈)的顺序调用callback,然后程序退出。 与abortexit不返回给调用者。 stdio文件stream被刷新,然后closures。 此外,调用C ++类实例的析构函数。