gpt4 book ai didi

c++ - _Exit 在 C++ 程序中的行为如何?

转载 作者:IT老高 更新时间:2023-10-28 23:10:13 31 4
gpt4 key购买 nike

C99 提供了 _Exit 函数,它“立即”退出,尽管它 确实 可能会关闭文件描述符。 Unix/POSIX 通过强制关闭所有 fd 而不刷新(并提供同义词 _exit)来扩展此行为。

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

(受 this question 启发;我突然想知道 C++ 中典型的 fork-exec-_exit 习语会发生什么。)

最佳答案

首先,任何形式的程序退出都不会自动调用堆对象的析构函数(在 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() 不能。

更实际一点,在 abort()_exit() 的大多数 unix 实现中,abort() 会引发 >SIGABRT_exit() 只是调用操作系统调用来立即终止进程。这意味着主要区别是:

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

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

关于c++ - _Exit 在 C++ 程序中的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769229/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com