文件句柄while循环中的Perl超时



我正在寻找一种在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!

相关内容

  • 没有找到相关文章

最新更新