让我用一组具体的例子来提问。第一个代码,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生成提示&#34; pp&gt; &#34;,当给出输入&#34; 6&#34;时,打印&#34; Hello world&#34; 6次,间隔0.2秒(仅当间隔为+ ve数时)。非数字输入会使您退出循环,行计数的负数会导致无限循环。工作正常!
现在,考虑第二个脚本 - &#34; expnlines.pl&#34;,作为上述脚本的驱动程序。
#!/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;
如果我们将其作为&#34; expnlines.pl 4 0.2&#34;它工作正常。 &#34; expnlines.pl -1 0.3&#34; (或其他任何超时)也有效。对于-ve#for linecount,第一个脚本进入无限循环但是被期望超时。但是,&#34; expnlines.pl -1 0&#34;无法阻止无限循环(在那2秒之后),我无法弄清楚如何期望中断此循环。
有什么建议吗? TIA。
顺便说一句,在我的现实世界中,我对#34; nlines.pl&#34;的二进制文件没有任何控制权。我的脚本是&#34; expnlines.pl&#34;,我使用expect作为二进制文件的驱动程序,具有不同的参数。当子进程运行无限循环时,我需要一些机制来检测并阻止它,我无法弄清楚如何。感谢回应。
答案 0 :(得分:1)
超时后,您可以使用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";
}