我有一个使用 OPEN 和管道执行的命令,我想设置 10 秒的超时时间,如果执行时间超过此时间,则子进程中止。但是,我的代码只会导致程序挂起 - 为什么我的 ALARM 没有正确传递?
my $pid = 0;
my $cmd = "someCommand";
print "Running Command # $num";
eval {
local $SIG{ALRM} = sub {
print "alarm \n";
kill 9, $pid;
};
alarm 10;
pid = open(my $fh, "$cmd|");
alarm 0;
};
if($@) {
die unless $@ eq "alarm \n";
} else {
print $_ while(<$fh>);
}
编辑:
所以从下面的答案中,这就是我所拥有的:
my $pid = open(my $fh, qq(perl -e 'alarm 10; exec \@ARGV; die "exec: $!\n" ' $cmd |));
print $_ while(<$fh>);
但是当警报超时时,这个打印 ALARM CLOCK 到控制台......而我没有在代码中的任何地方指定这个......我怎样才能摆脱这个,我应该把自定义警报事件处理程序放在哪里?
谢谢!