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?