3

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

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

当 Firefox 崩溃或我杀死它时,它会记住我是什么页面。每次我点击一个页面时它都会记录地址还是在信号/崩溃时这样做?

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

4

3 回答 3

4

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

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

于 2009-01-27T09:14:13.277 回答
1

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

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

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

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

于 2009-01-27T14:31:22.000 回答
0

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

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

于 2009-01-27T15:35:07.953 回答