我遇到了Perl Threading的一些问题,需要你的帮助。
我想在perl中运行一些任务[adb执行一些命令]。我的要求是在执行命令完成后退出循环/线程,或者在指定的时间[比如3小时]后终止执行任务。为此,我试图使用:线程
任务1 - 执行某些事情 - 可能需要更少或更多时间 任务2 - 3小时的定时器
所以它正在部分运作。我的意思是,一旦ADB任务完成,退出循环,而不是相反。
<pre>
use threads;
my $thr = threads->create(\&sub1); # Spawn the thread
$thr->detach(); # Now we officially don't care any more
my $thr = threads->create(\&sub2); # Spawn the thread
$thr->join();
#sleep_string(10); # Let thread run for awhile
sub sub1 {
sleep(10800);
}
sub sub2 {
Execute ADB task
}
</pre>
答案 0 :(得分:0)
继续发表评论之后,我的建议就是根本没有线索。这个看起来像一个你正在运行的简单系统命令,你想在超时后杀死它。
所以我会这样做:
#!/usr/bin/perl
use strict;
use warnings;
alarm 3;
my $pid = open ( my $output_from_proc, "-|", "tail -f /var/log/messages" );
$SIG{'ALRM'} = sub {
print "Killing $pid because of timeout\n";
kill 15, $pid
undef $SIG{'ALRM'}; #irrelevant unless you reuse alarm
};
print <$output_from_proc>;
waitpid ( $pid, 0 );
open
作为可执行文件打开,并执行它自己的fork - 并通过STDOUT
返回$output_from_proc
。您设置了'ALRM'信号处理程序。 alarm
请求内核在指定的时间之后向您发送SIGALRM
(它非常精确,但超过了超时)。
当你的ALRM
信号到来时,这个过程就会被杀死。如果你真的想要这应该在一个线程中工作,但我会尽量避免它。