【问题标题】:Execute function on exit or program end在退出或程序结束时执行函数
【发布时间】:2017-06-14 09:25:41
【问题描述】:

我有一个析构函数,即使程序被不正确地终止,也需要调用它以确保外部进程终止。

目前我已经注册了要被调用的析构函数

std::atexit(killprocess);
std::at_quick_exit(killprocess);

然而,这意味着当程序完成但未终止时,进程不会被终止。有什么方法可以确保在退出时或程序完成但未终止时调用 killprocess 或析构函数?

编辑:已完成但未终止的状态来自 Visual Studio,它在末尾添加了一个等待条件。我相信这意味着使用 atexit 注册了 killprocess 进程析构函数不会在执行中自然调用

【问题讨论】:

  • “已完成但未终止”是什么意思?您是指main 返回和进程实际结束之间的时间吗?
  • 在main的最后一行调用killprocess
  • 在 POSIX 系统(如 Linux 和 macOS)上,您可以捕获某些用于异常终止的signals但是 一些“异常终止”可能是由于您想用killprocess 清理的东西而导致的崩溃,这反过来可能意味着killprocess 可能不起作用。如果你有一个崩溃,就让它发生。捕获SIGQUITSIGTERMSIGINTSIGHUP 信号,并调用exit,它将调用已安装的退出处理程序。
  • 您的意思是 Visual Studio 在已终止的控制台应用程序窗口中放置的“按任意键...”文本吗?那么你的程序已经终止并且不再运行了。如果程序正常退出,那么您的退出处理程序和全局和静态对象的析构函数将已经运行。程序终止和 Visual Studio 等待您按键之间的这种状态全部由 Visual Studio 处理。
  • 你的析构函数是什么?调用 exit() 告诉内核(UNIX、Linux 或 Windows)取消分配所有进程内存。不需要清理任何东西,它只会停止退出。例如,当您必须在崩溃时删除文件时,然后编写另一个进程来启动您的应用程序,保护它,并在崩溃的情况下执行您的特殊操作(异常程序退出)。

标签: c++ c++14 destructor atexit


【解决方案1】:

我认为你问错了问题。您的目标实际上是找到一种方法来确保如果父进程死亡,外部进程也会死亡。但是仅仅依靠父进程中的一些函数调用是无法确保这一点的。父进程总是有可能陷入不一致的状态,或者不可避免地无法调用此清理函数。因此,还有一些其他机制可以实现所需的行为,例如在子进程中处理某些类型的保活。例如,您可以从父进程提供管道,因此当它因任何原因终止时,父进程管道端将被系统自动关闭,子进程可以确定它需要退出。

【讨论】:

    【解决方案2】:

    std::atexit 注册的退出处理程序应该在正常进程结束时调用。如果不是这种情况,那么您必须寻找其他地方。 请参阅std::atexit 的文档。也许你也想设置std::set_terminate 处理程序。 有些节目结尾是无法处理的,所以如果你想确定,你就不得不求助于某种外部监控。 cmets 中已经很少有想法了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2014-05-17
      • 2021-03-20
      相关资源
      最近更新 更多