2

如何在 Windows 上重新加载崩溃的进程?当然,我可以运行自定义监控Win服务进程。但是,例如火狐:它似乎没有安装这样的东西,但它仍然可以在崩溃时自行重启。

4

4 回答 4

4

在 Vista 及更高版本上,您可以使用RegisterApplicationRestart API在崩溃或挂起时自动重启。

在 Vista 之前,您需要有一个顶级异常过滤器来执行重新启动,但请注意,在受感染进程内运行代码并不完全安全或可靠。

于 2009-03-21T00:29:23.080 回答
1

每次您打开选项卡或单击链接或执行某些其他操作时,Firefox 都会不断地将其状态保存到硬盘上。它还保存了一个标志,表明它已安全关闭。

在启动时,它会读回所有内容,并能够根据该信息“恢复”。

于 2009-03-21T00:29:05.703 回答
1
  • 结构化异常处理 (SEH)允许您捕获程序崩溃并在它发生时执行某些操作。
    请参阅: __try和 __except
    SEH 可能非常危险,并且可能导致您的程序挂起。请参阅这篇文章了解更多信息。

  • 如果您将程序编写为 NT 服务,那么您可以将第一次、第二次和随后的失败操作设置为“重新启动服务”。

  • 对于 Windows 2008 服务器和 Windows Vista 和 Windows 7,您可以使用 Win32 API RegisterApplicationRestart

有关处理不同类型的程序崩溃的更多信息,请在此处查看我的答案。

于 2009-03-21T01:20:25.237 回答
0

如果我没记错的话,Windows 至少实现了 POSIX 的某些子集,因此“必须”具有信号接口(如 SIGKILL、SIGSEGV、SIGQUIT 等)。

我从来没有这样做过,但在 linux 上,但你可以尝试使用 signal() (signal.h) 设置意外终止陷阱。从文档的快速扫描看来,在处理信号时可以做的事情很少,甚至有可能启动一个新进程也在禁止列表中。

既然我已经考虑过了,我可能会选择主/工作者模式,非常简单的父线程,除了产生工作者之外什么都不做(它会做所有的 UI / 其他事情)。如果它没有设置特定的“我现在要死了”位但仍然死了(父进程总是收到消息/通知说生成的进程死了)然后主重生工人。主题是保持大师非常简单,并且由于自己的错误而难以死去。

于 2009-03-21T00:51:25.243 回答