【发布时间】:2010-10-14 16:25:54
【问题描述】:
如何在 Windows 上重新加载崩溃的进程?当然,我可以运行自定义监控Win服务进程。但是,比如火狐:它好像没有安装这种东西,但是当它崩溃时它仍然可以重新启动。
【问题讨论】:
-
怎么和编程不完全相关?
-
@Mitch:是的,我也想澄清一下。
标签: winapi process crash reload
如何在 Windows 上重新加载崩溃的进程?当然,我可以运行自定义监控Win服务进程。但是,比如火狐:它好像没有安装这种东西,但是当它崩溃时它仍然可以重新启动。
【问题讨论】:
标签: winapi process crash reload
每次您打开选项卡或单击链接或执行其他操作时,Firefox 都会不断地将其状态保存到硬盘上。它还保存了一个标志,表明它已安全关闭。
在启动时,它会读回所有内容,并能够根据该信息“恢复”。
【讨论】:
在 Vista 及更高版本上,您可以使用 RegisterApplicationRestart API 在崩溃或挂起时自动重启。
在 Vista 之前,您需要有一个顶级异常过滤器来执行重新启动,但请注意,在受感染进程内运行代码并不完全安全或可靠。
【讨论】:
如果我没记错的话,Windows 至少实现了 POSIX 的某些子集,因此“必须”具有信号接口(例如 SIGKILL、SIGSEGV、SIGQUIT 等)。
我从来没有这样做过,但在 linux 上,但您可以尝试使用 signal() (signal.h) 设置意外终止陷阱。 从文档的快速扫描看来,在处理信号时可以做的事情很少,甚至有可能启动一个新进程也在禁止列表中。
现在我已经考虑过了,我可能会选择 master/worker 模式,这是非常简单的父线程,除了生成 worker 之外什么都不做(完成所有 UI / 其他事情)。如果它没有设置特定的“我现在要死了”位但仍然死了(父进程总是收到消息/通知说生成的进程死了)然后主重生工人。主题是保持大师非常简单,很难因为自己的错误而死。
【讨论】:
Structured exception handling (SEH) 允许您捕获程序崩溃并在发生时执行某些操作。
见:__try and __except
SEH 可能非常危险,并且可能导致您的程序挂起。请参阅this article 了解更多信息。
如果您将程序编写为 NT 服务,那么您可以将第一次、第二次和随后的失败操作设置为“重新启动服务”。
对于 Windows 2008 服务器和 Windows Vista 和 Windows 7,您可以使用 Win32 API RegisterApplicationRestart
有关处理不同类型的程序崩溃的更多信息,请参阅my answer here。
【讨论】: