2
我的管道(文件句柄,套接字)中断(有时)。我可以用下面的代码重现:Perl:如何防止SIGALRM关闭管道?
my $counter = 5;
alarm(1);
open(FH,"while(sleep 2); do date; done |") or die $!;
while (<FH>) { print; }
close(FH);
BEGIN {
$SIG{ALRM} = sub {
print "alarm!\n";
exit if --$counter == 0;
alarm(1);
};
}
将产生:
alarm!
alarm!
Thu Feb 7 11:46:29 EST 2013
alarm!
alarm!
alarm!
如果我与strace这个过程中,我看到催生外壳得到一个SIGPIPE。但是,Perl进程继续愉快。我该如何解决?
什么问题?在您的ALRM处理程序中,您调用exit,以便perl退出并关闭文件描述符。当子shell写入关闭的文件句柄时,它会得到一个SIGPIPE。您是否希望subshell忽略SIGPIPE,并且只会一直持续下去,写入失败? –
你调用'exit'后,你的Perl进程会继续快乐吗? – mob