用户杀死进程时发出信号?

时间:2009-01-27 09:10:16

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

我重载了此网站http://www.cplusplus.com/reference/clibrary/csignal/signal.html

上列出的6个信号

然后我运行我的应用程序(双击没有通过IDE运行)并尝试1)结束任务2)X在topright和3)kill进程。我预计前两个会产生某种信号(我在XP上)但是我什么也没得到。当信号出现时,我不允许打开要写入的文件吗?我猜我是(SIGSEGV允许我)。

当firefox崩溃或我杀了它时,它会记住我是什么页面。它是在每次点击一个页面时记录地址还是在信号/崩溃时执行此操作?

我的主要问题是我可以使用什么信号来捕捉杀戮过程

3 个答案:

答案 0 :(得分:4)

Win32没有提供截取你的程序被TerminateProcess拦截的选项(当你从任务管理器“结束任务”或点击[X]时会发生这种情况)。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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