在未处理的异常上重新启动应用程序

时间:2011-05-17 21:50:04

标签: c++ windows exception

如果程序崩溃,是否可以自动重启程序?

类似的东西:

  1. 抛出未处理的异常。
  2. 释放按流程分配的所有资源。
  3. 重新开始并致电main。
  4. 对于我正在处理的服务器应用程序,我希望这种行为。如果客户端错过使用服务器,它可以获得std :: bac_alloc异常,在这种情况下,我希望服务器只需重启而不是崩溃和关闭,从而避免手动启动。

5 个答案:

答案 0 :(得分:6)

我之前在Windows中通过win32 CreateProcess调用从另一个程序运行所述程序来完成此操作。然后另一个程序等待“受监视”进程退出,如果有,则再次调用CreateProcess()。您可以通过对流程'句柄执行WaitForSingleObject来等待流程退出,您可以将其作为CreateProcess()来电中的返回值之一。

您当然希望以某种方式进行编程,以使监控过程自行关闭,并将子进程关闭。

答案 1 :(得分:4)

让Windows成为您的监督者。您可以致电ChangeServiceConfig2为您的服务设置失败操作。 (如果您的服务器不是服务,那么您做错了。)为SERVICE_CONFIG_FAILURE_ACTIONS参数指定dwInfoLevel,并在SERVICE_FAILURE_ACTIONS结构中设置lpsaActions到一个或多个SC_ACTION值的数组。您想要的类型是SC_ACTION_RESTART

答案 2 :(得分:3)

我通过实施看门狗做了类似的事情。看门狗作为一项服务运行,并将等待来自受监控进程的ping(称为抚摸狗)。如果受监视的进程因异常而死亡,则看门狗将清理并重新启动应用程序。

如果应用程序没有响应(在一定时间内没有ping),监视程序将终止它然后重新启动它。

以下是您可能想要使用的实现的链接: http://www.codeproject.com/KB/security/WatchDog.aspx

(PS:我实现了自己的版本,但我不能在这里发布。我通过快速谷歌搜索找到了这个,并没有这个特定实现的第一手经验。)

答案 3 :(得分:1)

如果您只是捕获异常,应该可以通过内部编程逻辑重新启动服务器,而无需完全重新启动整个程序。

答案 4 :(得分:1)

与@ T.E.D。一样,我们在我们构建的应用程序中完成了这项工作。我们的应用程序是一个Windows服务,所以帮助程序停止服务(最终杀死它,如果它挂起)并再次启动服务。