【问题标题】:Shutdown Hook c++关机挂钩 c++
【发布时间】:2011-08-07 18:30:10
【问题描述】:

是否有某种方法可以在终止时运行代码,无论哪种终止(异常、正常、未捕获的异常等)? 我知道它在 Java 中实际上是可能的,但在 C++ 中甚至可能吗?我假设是 windows 环境。

【问题讨论】:

  • 这在 Java 中也是不可能的——无论语言如何,所有进程都无法在 linux(以及 Windows 上的等价物)上捕获 signal-9 或在该信号到达时运行任何代码
  • 正如@Drake 建议的那样,我会选择atexit

标签: c++ hook exit shutdown termination


【解决方案1】:

不--如果有人调用TerminateProcess,您的进程将被销毁,无需进一步告别,并且(特别是)在关闭过程中没有任何机会运行更多代码。

【讨论】:

  • 这是正确的答案;但是,正如其他一些答案所表明的那样,您可以使用atexit() 设置退出处理程序,并且可以使用signal() 捕获大多数信号-但是,如果有人强制终止,您将永远无法采取任何行动(那将是杀死- 9 在 Linux 上,信号 9 是不可捕获的)
  • 谢谢,其实我很怕那个回答
  • 还有:assert()、abort()、terminate()
【解决方案2】:

对于正常的关闭申请,我建议

atexit()

【讨论】:

  • 那只是为了正常终止。
【解决方案3】:

解决问题的一个好方法是使用 C++ RAII 习惯用法,这意味着清理操作可以放在对象的析构函数中,即

class ShutdownHook {
  ~ShutdownHook() { 
    // exit handler code 
  }
}; 

int main() { 
  ShutdownHook h; 
  //...
} 

查看 ACE 库中的 Object Lifetime Manager。在链接的文档中,他们还讨论了atexit 函数。

【讨论】:

  • 以上我假设出口是“正常的”,即不是通过例如exit()调用,或者由于分段错误等
  • 小心。这不能保证有效。如果异常从 main() 中转义,则在实现中定义堆栈是否展开。因此,为了保证这项工作,您必须在 main() 中捕获所有异常(将您的代码放在 try 块中)。您不需要做任何事情,只需在后面重新抛出异常即可。
【解决方案4】:

不用于任何形式的终止;有些信号设计为不被处理,例如 Linux 上的 KILL。

这些信号旨在终止已消耗所有内存、CPU 或其他一些资源的程序,并使计算机处于难以运行处理程序函数的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多