簡體   English   中英

如何期望在生成的過程中擺脫無限循環

[英]How can expect get out of infinite loop in a spawned process

讓我用一組具體的例子來問這個問題。 第一個代碼,nlines.pl 如下:

#!/usr/local/bin/perl
#########################
# print Hello world n times with n entered by a prompt
#########################

use strict;
use Time::HiRes qw(sleep);

die "Syntax: $0 <prompt> <time2sleep>\n" if ($#ARGV < 1);
my $prompt = $ARGV[0] . '> ';
my $sleepsec = $ARGV[1];        print "$0: Timeout interval: $sleepsec\n";
print $prompt;
while (<STDIN>) {
        chomp;
        last unless /\d+/;
        my $loopCount = $_;
        print "\n$0: Received request for $loopCount lines\n";
        for (my $count = 0; $count != $loopCount ; $count++) {
                Time::HiRes::sleep($sleepsec) if ($sleepsec > 0);
                print "$0 [$count] Hello world\n"
        }
        print $prompt
}
print "Bye bye\n";
exit 0;

$ nlines.pl pp 0.2 生成提示“pp>”,當輸入“6”時,打印“Hello world”6 次,時間間隔為0.2 秒(僅當間隔為+ve 數時)。 非數字輸入使您脫離循環,而行數的負數會導致無限循環。 工作正常!

現在,考慮第二個腳本 - “expnlines.pl”,作為上述腳本的驅動程序。

#!/usr/local/bin/perl
#############################
# expnlines.pl: driver for nlines.pl
#############################

use strict;
use Expect;

die "Syntax: $0 <Count> <SleepSec>\n" if ($#ARGV < 1);
my $count = $ARGV[0];
my $child = 'nlines.pl';
my $prompt = 'CountOfLines';
my $ex = Expect->new;
$ex->raw_pty(1);
$ex->spawn ($child, $prompt, $ARGV[1]);
$ex->expect (1, $prompt) or die "$0: No prompt from $child\n";
print "$0: Sending $count\n";
$ex->send($count . "\n");
$ex->expect (2, $prompt) or die "\n$0: Expect timed out for $count\n";
print "\n$0: Received prompt back from expect\n";
exit 0;

如果我們將其作為“expnlines.pl 4 0.2”運行,它工作正常。 “expnlines.pl -1 0.3”(或其他超時時間)也有效。 對於 linecount 的 -ve #,第一個腳本進入無限循環,但被expect 超時。 但是,“expnlines.pl -1 0”無法停止無限循環(在那 2 秒之后),我無法弄清楚如何期望中斷此循環。

有什么建議? TIA。

順便說一句,在我的現實世界中,我無法控制“nlines.pl”的二進制文件的等效項。 我的腳本是“expnlines.pl”,我使用 expect 作為二進制文件的驅動程序,具有不同的參數。 當子進程運行無限循環時,我需要某種機制來檢測和停止它,但我不知道如何進行。 欣賞回應。

超時后,您可以使用hard_close關閉命令(或者如果您需要使用soft_close ,並且可以等待它使用的額外時間)來終止它,以及無限循環。

代替

$ex->expect (2, $prompt) or die "\n$0: Expect timed out for $count\n";

你可以做類似的事情

if (!$ex->expect(2, $prompt)) {
    print "\n$0: Expect timed out for $count, closing\n";
    $ex->hard_close();
}
else {
    print "\n$0: Received prompt back from expect\n";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM