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