2

我担心执行Storable::store操作时数据损坏。我正在将大约 100 MB 的数据写入 NFS 以在特定检查点备份我的计算,但该过程并不十分迅速。

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

该全局变量用于指示信号处理程序是否会调用die,或者它是否只会打印一条语句“Can't stop yet”。

但我真的有帮助吗?我现在从阅读perlipc中看到,中断 IO 有时是安全完成的,有时则不是......也就是说,如果我的信号处理程序最终在我的Storeable::store操作中间被调用,那么对我的信号处理程序子例程的短暂转移可能仍然足以把事情搞砸。

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

4

2 回答 2

4

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

您只需要担心两件事:

  • $!在信号处理程序中修改全局变量(例如)。
  • 系统调用返回 EINTR 或 EAGAIN,因为在调用期间有信号进入。
于 2013-02-20T02:54:33.590 回答
2

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

于 2013-02-20T02:12:41.197 回答