perl - Perl 是否在可存储写入期间安全地延迟 INT 信号?

标签 perl io signals ipc

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

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

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

但我真的有帮助吗?我现在从阅读中看到 perlipc中断 IO 有时是安全完成的,有时不是......也就是说,我的信号处理程序是否应该在我的 Storeable::store 操作中间被调用,这样一个简短的转移到我的信号处理程序子例程可能仍然足以把事情搞砸。

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

最佳答案

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

您只需要担心两件事:

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

关于perl - Perl 是否在可存储写入期间安全地延迟 INT 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14971093/

相关文章:

java - Java中如何模拟文件IO?

c++ - 判断进程是否挂起

如果我尝试在信号处理程序中调用开放系统,则代码转储

linux - unix - 用字符出现次数分割多少行

Perl WWW::Mechanize 和经过身份验证的代理

c - getc() 是在返回 EOF 后定义的吗?

linux - Linux 中的 IO 多路复用

c - 如何避免在信号处理程序中使用 printf?

perl - Math::BigInt 错误:无法定位对象方法 "bmuladd"

Perl - Web::Scraper - 链接数组