在可存储写入期间,Perl是否安全地推迟INT信号?

时间:2013-02-20 02:02:14

标签: perl io signals ipc

我担心执行Storable::store操作时数据损坏。我正在写一个大约100 MB的NFS来备份我在特定检查点的计算,但这个过程并不是很快。

为了防止损坏,我有一个SIG{INT}信号处理程序。在调用Storable::store之前,设置了一个全局变量,表明终止是不安全的。 Storable::store完成后,该全局变量将返回一个值,表示可以中断。

该全局变量用于指示信号处理程序是否将调用die,或者它是否只打印一条声明“无法停止”。

但我真的在帮忙吗?我现在从阅读perlipc看到中断IO有时是安全地完成的,有时它不是......也就是说,如果我的信号处理程序最终在Storeable::store操作的中间被调用,例如简单地转移到我的信号处理程序子程序可能仍然足以搞砸了。

有谁知道Storable在这种情况下的表现如何?或者我的信号处理设置是否合适?

2 个答案:

答案 0 :(得分:4)

从5.8.1开始,Perl使用“safe signals”(默认情况下)。当您通过%SIG设置信号处理程序时,Perl实际上安装了一个简单的信号处理程序,除了递增计数器之外什么都不做。在Perl操作之间,Perl检查计数器是否为非零,如果是,则调用您的信号处理程序。这样,您的信号处理程序不会在系统调用或库调用过程中执行。

您只需要担心两件事:

  • 修改信号处理程序中的全局变量(例如$!)。
  • 系统调用返回EINTR或EAGAIN,因为在通话过程中有信号进入。

答案 1 :(得分:2)

如果您真的担心SIGINT可能会中断store,请尝试将SA_RESTART添加到信号处理程序中。在Linux上,这将强制系统调用在信号时自动重试。这可能会无限期推迟您的信号处理程序,因为SIGINT将无法突破I / O操作。但是,它应该能够在任何中断情况下安全地操作Storable::store