【问题标题】:signal when user kills process?当用户杀死进程时发出信号?
【发布时间】:2009-01-27 09:10:15
【问题描述】:

我超载了本网站http://www.cplusplus.com/reference/clibrary/csignal/signal.html上列出的 6 个信号

然后我运行我的应用程序(双击未通过 IDE 运行)并尝试 1)结束任务 2)右上角的 X 和 3)终止进程。我预计前两个会引起某种信号(我在 XP 上),但可惜我什么也没得到。当信号发生时,我是否不允许打开要写入的文件?我猜我是(SIGSEGV 允许我)。

当 firefox 崩溃或当我杀死它时,它会记住我的页面。它是在我每次点击页面时记录地址还是在信号/崩溃时记录地址?

我的主要问题是我可以使用什么信号来捕获终止进程

【问题讨论】:

    标签: c++ windows-xp crash signals kill-process


    【解决方案1】:

    Win32 不提供拦截您的程序被TerminateProcess 杀死的选项(当您从任务管理器“结束任务”或单击 [X] 时会发生这种情况)。

    您可以捕获 SIGSEGV 信号,因为 C 运行时库在 Windows 上运行时提供了此信号的模拟。当您的程序导致 Windows 访问冲突(异常 0xC0000005)时,运行时库可以选择捕获它并为您模拟 Unix 风格的 SIGSEGV。然而,这并不是处理此类异常的最佳方式。如果您正在编写 Win32 程序,通常不应该尝试使用 Unix 风格的服务。

    【讨论】:

    • [X],关闭窗口由 WM_CLOSE 处理? (或 CTRL_CLOSE_EVENT 用于控制台)
    • @MSalters:关于 WM_CLOSE 的观点很好,当然这就是 GUI 程序所发生的事情。在我的回复中,我正在考虑控制台程序。而且,我不知道 CTRL_CLOSE_EVENT,谢谢!
    【解决方案2】:

    如果您覆盖调用 SetUnhandledExceptionFilter 的默认异常处理程序(这是一个 win32 函数,因此不依赖于 C 库仿真),您可以捕获运行时错误,例如访问冲突。这是在程序崩溃时提供“小型转储”的方法。

    但是当您正常关闭应用程序或从任务管理器关闭应用程序时,不会调用此异常处理程序。在最后一种情况下,windows 正在调用 TerminateProcess,不是完全关闭,而是强制您的程序终止。

    我不知道 Firefox 使用的是哪个实现,但是保存当前打开的选项卡可能会运行一个计时器,并且每次运行它都会将历史记录保存到文件和某种脏标记。

    检测程序何时关闭(由防病毒程序和类似程序实现)的其他更复杂的解决方案是运行两个不相关的程序,每个程序检查另一个程序是否仍在运行,如果一个检测到另一个程序已关闭,则运行它再次。

    【讨论】:

      【解决方案3】:

      Windows 应用程序是控制台应用程序或 GUI 应用程序。控制台应用程序倾向于获得 WM_CLOSE,控制台应用程序 CTRL_CLOSE_EVENT。也不是信号。如果您的应用程序通过 TerminateProcess() 结束,则两者都不会发送。

      如果您想存储您所在的位置,请使用内存映射文件并在每次操作时更新该文件。当你的进程退出时,内存中的脏页被操作系统写回文件,可能在其他时候也是如此。此解决方案允许操作系统为您管理磁盘 I/O,并且它处于更好的位置。

      【讨论】:

        猜你喜欢
        • 2016-08-30
        • 2011-03-28
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 2010-12-08
        相关资源
        最近更新 更多