exit()和abort()有什么区别?
在C和C ++中, exit()
和abort()
什么区别? 我想在发生错误(不是例外)后结束我的程序。
abort()
退出你的程序,不用先调用使用atexit()
注册的函数,也不先调用对象的析构函数。 exit()
在退出程序之前都执行。 它不会为自动对象调用析构函数。 所以
A a; void test() { static A b; A c; exit(0); }
将会正确地破坏a
和b
,但不会调用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,然后程序退出。 与abort
, exit
不返回给调用者。 stdio
文件stream被刷新,然后closures。 此外,调用C ++类实例的析构函数。
- Object.getOwnPropertyNames与Object.keys
- 在Linux中测量时间 – 时间vs时钟vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?