2013-12-17 30 views
0

我正在寻找一种在即时搜索活动日志的while循环中引入超时的方法。在一个文件句柄while循环中的Perl超时

我担心这可能是不可能的,因为我下面的尝试总是会超时,因为我正在偏离正在进行的文件句柄日志搜索,因此未找到或未找到日志字符串。

有没有什么办法解决这个问题,没有太多的编辑,我说这是因为下面的代码段是为了在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; 
    } 
} 

回答

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 ([email protected] =~ /^Timeout/) { 
    # it was timeout 
    # handler called 
    # and died inside eval 
    $DNOTComplete = 1; 
} 
+0

非常感谢奥列格·G,这正是我所期待的,它的工作原理一种享受!再次感谢。 – MikG

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); 

OUTPUT:

$ 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!