如何在Windows上重新加载崩溃的进程?当然,我可以运行自定义监控Win服务流程。但是,例如,Firefox:它似乎没有安装这样的东西,但它仍然可以在崩溃时重新启动。
答案 0 :(得分:4)
在Vista及更高版本上,您可以使用RegisterApplicationRestart API在崩溃或挂起时自动重启。
在Vista之前,您需要有一个顶级异常过滤器来重启,但请注意,在受损过程中运行代码并不完全安全或可靠。
答案 1 :(得分:1)
每次打开选项卡或单击链接或执行其他操作时,Firefox都会不断将其状态保存到硬盘。它还保存了一个标志,表示它安全关闭。
启动时,它会全部读回来,并且能够根据该信息“恢复”。
答案 2 :(得分:1)
Structured exception handling (SEH)允许您捕捉程序崩溃并在事件发生时执行某些操作
见:__try and __except
SEH可能非常危险,但可能会导致您的程序挂起。有关详细信息,请参阅this article。
如果您将程序编写为NT服务,则可以将第一,第二和后续失败操作设置为“重新启动服务”。
对于Windows 2008服务器和Windows Vista以及Windows 7,您可以使用Win32 API RegisterApplicationRestart
有关处理不同类型的程序崩溃的详细信息,请参阅my answer here。
答案 3 :(得分:0)
如果我没记错,Windows至少实现了POSIX的某些子集,因此“必须”拥有信号接口(如SIGKILL,SIGSEGV,SIGQUIT等)。
我从来没有这样做但是在Linux上,但你可以尝试使用signal()(signal.h)设置意外的终止陷阱。 通过快速扫描文档,似乎在处理信号时可以做很少的事情,即使启动新进程也可能在禁止列表中。
现在我已经考虑过了,我可能会选择master / worker模式,非常简单的父线程,除了生成工作者之外什么也不做(所有的UI /其他事情)。如果它没有设置一个特定的“我现在要死了”位但仍然死亡(父进程总是得到生成进程死亡的消息/通知),那么master重新生成了worker。主题是保持大师非常简单,并且由于自己的错误而难以死亡。