Perl Script在信号处理程序中重新打开文件

时间:2013-06-07 18:40:29

标签: perl file signals

我有这个perl脚本:

#!/bin/perl
use strict;
use warnings;
use Time::HiRes qw(usleep);
my $fd;
sub reopen {
    open $fd, ">>", "file.log" or die $!;
}
$SIG{USR1} = \&reopen;
reopen();
while(1){
    syswrite $fd, time . " ($$): message\n";
    usleep(100000);
}

我在信号处理程序中重新打开文件句柄。这样安全吗?

1 个答案:

答案 0 :(得分:4)

[1] 。从5.8.1开始,实际的信号处理程序只是设置一个标志,表示接收到信号 [2] 。在语句之间检查该标志。系统调用(例如usleep)在被信号中断时返回错误$!{EINTR},允许检查标志。

信号将中断usleep,并且在评估下一个语句(reopen [3] )之前将调用syswrite


  1. 好吧,如果被中断的代码使用这些代码,你可能想要local ($!, $^E);
  2. 除非您禁用“安全信号”。
  3. 您为什么使用syswrite代替print?是为了避免缓冲?使用$fd->autoflush(1);来执行此操作。