_Exit如何在C++程序中运行?

Fre*_*Foo 12 c c++ unix destructor exit

C99提供了_Exit功能,"立即"退出,但它确实可以关闭文件描述符.Unix/POSIX通过强制关闭所有fd而不刷新(并提供同义词_exit)来扩展此行为.

static当从C++程序调用时,这些函数是否会调用对象的析构函数?C++标准是否有任何保证_Exit

(受这个问题的启发;我突然想知道典型的情况会发生什么fork- exec- _exitC++中的习语.)

bdo*_*lan 11

首先,任何形式的程序退出都不会自动调用堆对象的析构函数(隐含在ISO/IEC 14882:1998(E)12.4.10中).

调用exit()不会为具有自动持续时间的对象调用析构函数,因为它不会通过其封闭范围返回(3.6.1.4).但是,按照构造的相反顺序调用静态对象的析构函数(18.3.8).

调用abort()不会为任何类型的对象调用任何析构函数,也不会调用atexit()已注册的函数(18.3.3).我在这里的C++标准副本有点过时,没有提及_exit_Exit直接,但我想,如果存在,它们应该表现相同 - 也就是说,不要调用任何析构函数.特别是,在C99标准中,_Exit()跳过atexit处理程序(实现定义是否刷新流缓冲区,关闭打开的流,还是删除临时文件).

进一步注意,abort()可以通过捕获信号取消SIGABRT(ISO/IEC 9899:1999(E)7.20.4.1.2 - 我这里只有C99,但我希望它在C++引用的版本中是相同的)._Exit()不能.

在一个更实际的音符,在大多数UNIX实现abort()_exit(),abort()引发了SIGABRT_exit()只是调用操作系统调用立即终止进程.这意味着主要的区别是:

  • 您可以为其指定退出代码 _exit()
  • abort() 可能被信号处理程序困住
  • 根据系统配置,操作系统和ulimit,abort()可能会导致核心转储或类似情况

在一种fork()/exec()模式中,_exit()可能更可取,以避免核心转储的可能性.


Mat*_*hen 10

它在标准C++中根本不存在,因此无法保证.

计划纳入C++ 0x中.这指定(§18.5):

函数_Exit(int status)在本国际标准中有其他行为:

- 程序终止而不执行自动,线程或静态存储持续时间对象的析构函数,并且不调用传递给atexit()的函数(3.6.3).

跟进:

ISO于2011年8月12日批准了C++ 0x.

  • 但是`std :: exit()`确实存在,它确实保证了全局和静态对象的清理.[3.6.3/1] (4认同)