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

drl*_*exa 3 perl signals file

我有这个 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);
}
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 5

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

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


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