我正在寻找一种在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;
}
}
答案 0 :(得分:2)
这是你在寻找什么?
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;
}
答案 1 :(得分: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!