如何处理在Windows上Perl的exception程序终止

我在Windows上有一个Perl程序,需要在退出时执行清理操作。 我使用sigtrap编写了一个信号处理程序,但它并不总是工作。 我可以拦截Ctrl-C,但是如果机器重新启动或程序以其他方式死亡,信号处理程序和END块都不会运行。 我读过Windows没有真正的信号,在Windows上的信号处理在Perl中是一种破解。 我的问题是,如何处理exception终止的Windows方式? 我想运行我的清理代码,不pipe程序如何终止(为什么不能被捕获)。 我读过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}目录中以句点开始放置文件或目录名称。

早在20世纪80年代,我就为专有的操作系​​统编写了会计软件。 当用户按下ESCAPE按钮时,我们假设立即返回到主菜单。 如果用户输入订单并从库存中取出货物,则交易将不完整,即使订单不完整,库存也会显示物品正在售出 。 解决办法是在下次有人下订单时检查这些不完整的订单,在进入新订单之前退出库存变化。 你的程序可能需要做类似的事情。