Winapi 如何在Windows上重新加载崩溃的进程

Winapi 如何在Windows上重新加载崩溃的进程,winapi,process,crash,reload,Winapi,Process,Crash,Reload,如何在Windows上重新加载崩溃的进程?当然,我可以运行一个定制的监控Win服务流程。但是,例如,Firefox:它似乎没有安装这样的东西,但它仍然可以在崩溃时重新启动。每当你打开一个选项卡或单击一个链接,或执行一些其他操作时,Firefox总是将其状态保存到硬盘上。它还保存了一个标志,表明它已安全关闭 启动时,它会将这些内容全部读取回来,并能够根据这些信息进行“恢复”。在Vista及更高版本上,您可以使用在其崩溃或挂起时自动重新启动 在Vista之前,您需要有一个顶级异常过滤器来执行重新启动

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

每当你打开一个选项卡或单击一个链接,或执行一些其他操作时,Firefox总是将其状态保存到硬盘上。它还保存了一个标志,表明它已安全关闭


启动时,它会将这些内容全部读取回来,并能够根据这些信息进行“恢复”。

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


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

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

除了在linux上,我从未这样做过,但是您可以尝试使用signal()(signal.h)设置意外的终止陷阱。 从文档的快速扫描来看,在处理信号的过程中,似乎可以做的事情很少,甚至可能启动一个新的流程都是被禁止的

现在我已经考虑过了,我可能会使用master/worker模式,这是一种非常简单的父线程,它除了生成worker之外什么都不做(它完成所有UI/其他事情)。如果它没有设置一个特定的“我现在就要死”位,但仍然死了(父进程总是收到消息/通知,表明生成的进程死了),那么master将使工作进程重生。主题是让master非常简单,并且由于自身的缺陷而难以死亡。

  • 允许您捕获程序崩溃并在崩溃发生时执行操作。
    请参阅:
    SEH可能非常危险,可能会导致您的程序挂起。有关更多信息,请参阅

  • 如果您将程序编写为NT服务,则可以将第一次、第二次和后续故障操作设置为“重新启动服务”

  • 对于Windows 2008 server、Windows Vista和Windows 7,您可以使用Win32 API


有关处理不同类型程序崩溃的更多信息,请参阅

米奇:是的,我也想得到一些澄清。