windows - Windows上Perl如何处理程序异常终止

标签 windows perl events signals activestate

我有一个 Windows 上的 Perl 程序需要在退出时执行清理操作。我使用 sigtrap 编写了一个信号处理程序,但它并不总是有效。我可以拦截 Ctrl-C,但如果机器重新启动或程序以其他方式终止,则信号处理程序和 END block 都不会运行。我读过 Windows 并没有真正的信号,Windows 上的信号处理有点像 Perl 中的 hack。我的问题是,如何以 Windows 方式处理异常终止?无论程序如何或为何终止(不包括无法捕获的事件),我都想运行我的清理代码。我读过 Windows 使用事件而不是信号,但我找不到有关如何在 Perl 中处理 Windows 事件的信息。

不幸的是,我没有从 CPAN 安装模块的权限,所以我将不得不使用 vanilla ActiveState Perl。更有趣的是,我使用的大多数机器都只有 Perl 5.6.1。

编辑: 我将不胜感激任何答案,即使它们需要 CPAN 模块或更新版本的 Perl。我想了解 Perl 中的 Windows 事件处理,欢迎提供任何信息。

最佳答案

在所有操作系统中,您总是可以突然终止任何程序。想想 Unix/Linux 中的 kill -9 命令。你在任何程序上这样做,它会立即停止。没有办法困住它。程序无法再请求几个操作系统周期来进行清理。

我不了解 Unix 和 Windows 信号之间的区别,但您可以想象为什么每个操作系统都必须允许我们在 Unix 中调用的 SIGKILL - 一种确定并立即终止任何程序的方法。

假设您有一个有缺陷的程序拦截终止请求(Unix 中的 SIGTERM),然后它进入清理阶段。该程序没有进行清理,而是陷入了一个请求越来越多内存的循环中。如果您无法拉动 SIGKILL 紧急绳索,您就会被卡住。

最终的SIGKILL,当然是墙上的插头。拉动它,程序(连同其他一切)就会戛然而止。您的程序不可能说“嗯……电源断了,机器停止运行了……最好启动旧的清理例程!

因此,您无法捕获每个程序终止信号,并且您的程序必须考虑到这一点。您可以做的是查看您的程序是否需要在运行前进行清理。在 Windows 上,您可以在程序启动时在注册表中添加一个条目,并在程序关闭并进行清理时将其删除。在 Unix 中,您可以在 $ENV{HOME} 目录中放置以句点开头的文件或目录名称。

回到 1980 年代,我为一个非常专有的操作系​​统编写了会计软件。当用户按下 ESCAPE 按钮时,我们假设立即返回到主菜单。如果用户正在输入订单,并从库存中取出东西,则交易将不完整,即使订单未完成,库存也会显示商品已已售出。解决方案是在下次有人输入订单时检查这些未完成的订单,并在输入新订单之前取消库存更改。您的程序可能必须执行类似的操作。

关于windows - Windows上Perl如何处理程序异常终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8386315/

相关文章:

c# - 在 ASP.NET Web 表单中显示来自 Windows 服务的信息

windows - Windows 7 启动/引导的时间

mysql - Perl、DBI 和 MySQL 定界符

cocoa - UIView没有事件

javascript - 单击事件触发两次(不是 jQuery)

c - 如何在 Windows 上使用 LWF 驱动程序将数据包注入(inject)接收 (Rx) 路径?

Python 命令行 -x 选项

Perl 6 - 接受 "Bareword"输入的子程序

windows - PAR 和 Win32::Exe

c++ - 有没有一种优雅的方法来激活焦点小部件所在的选项卡?