3

我有这个 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);
}

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

4

1 回答 1

5

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

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


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