面向';参考文献:fd-1<;0';SIGALRM在perl中引发异常时出错

面向';参考文献:fd-1<;0';SIGALRM在perl中引发异常时出错,perl,Perl,每当SIGALRM处理程序中抛出die异常时,我的perl脚本就会退出,并出现错误“refcnt:fd-1

每当SIGALRM处理程序中抛出die异常时,我的perl脚本就会退出,并出现错误“refcnt:fd-1<0”。如何解决这个问题

$ cat ~/alarm_error.pl
$SIG{ALRM}=sub{die};

# Kill the command1 if it runs more than 1s and move on to next command
alarm 1;
my $command1 = 'sleep 100';

open(CMD, "|($command1) < /dev/null");
eval{ close(CMD)};

my $command2 = 'sleep 1';
open(CMD, "|($command2) < /dev/null");
close(CMD);

$ perl ~/alarm_error.pl
refcnt: fd -1 < 0
$cat~/alarm\u error.pl
$SIG{ALRM}=sub{die};
#如果command1运行时间超过1s,则杀死它,并继续执行下一个命令
警报1;
我的$command1='sleep 100';
打开(CMD,“|($command1)
这在perl(5.31.1)的开发分支中已经修复,因此应该在一两个月后出现在5.32.0中。从perl5311delta.pod:

管道上的close()现在会先从 IO SV。这样可以防止再次尝试关闭已关闭的 PerlIO对象,如果信号处理程序在close()时调用die()或exit() 正在等待子进程完成。


在5.32.0中发布更改之前,是否有解决此问题的方法?@Naga,使用信号(非常激烈)肯定有替代方法。例如,您可以使用
IO::Select