我有这个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);
}
我在信号处理程序中重新打开文件句柄。这样安全吗?
答案 0 :(得分:4)
是 [1] 。从5.8.1开始,实际的信号处理程序只是设置一个标志,表示接收到信号 [2] 。在语句之间检查该标志。系统调用(例如usleep
)在被信号中断时返回错误$!{EINTR}
,允许检查标志。
信号将中断usleep
,并且在评估下一个语句(reopen
[3] )之前将调用syswrite
。
local ($!, $^E);
。syswrite
代替print
?是为了避免缓冲?使用$fd->autoflush(1);
来执行此操作。