我正在寻找一种在while循环中引入超时的方法,while循环正在动态搜索活动日志。
我担心这可能是不可能的,因为我下面的尝试总是会超时,因为我正在转移正在进行的文件句柄日志搜索的注意力,因此没有找到或错过日志字符串。
有什么方法可以在不进行过多编辑的情况下解决这个问题吗?我这样说是因为下面的代码段旨在在fork分支中运行(因为我有一个类似的会话同时运行)。
这是我糟糕的尝试。。。
my $countD = 0;
my $Dtimeout = 120;
my $DNOTComplete = 0;
while (<$log_DUT>) {
$fh_DUT->print($_);
last if m/standby handle h/;
$countD++;
sleep(1);
if ( $countD > $Dtimeout ) {
$DNOTComplete = 1;
last;
}
}
这就是你想要的吗?
my $countD = 0;
my $Dtimeout = 120;
my $DNOTComplete = 0;
eval {
local $SIG{ALRM} = sub { die "Timeout" }; # alarm handler
alarm($Dtimeout); # start alarm
# kernel will send us SIGALRM
# after $Dtimeout
while(<$log_DUT>) {
$fh_DUT->print($_);
last if m/standby handle h/;
$countD++;
}
alarm(0); # cancel alarm
};
if ($@ =~ /^Timeout/) {
# it was timeout
# handler called
# and died inside eval
$DNOTComplete = 1;
}
您正在寻找alarm
示例:
#!/usr/bin/perl
use strict;
use warnings;
local $SIG{ALRM} = sub { die "alarm!n" };
alarm(5);
while (1) {
print scalar localtime, "n";
sleep 1;
}
alarm(0);
输出:
$ perl test.pl
Tue Dec 17 08:53:57 2013
Tue Dec 17 08:53:58 2013
Tue Dec 17 08:53:59 2013
Tue Dec 17 08:54:00 2013
Tue Dec 17 08:54:01 2013
alarm!