我有一个看似简单的问题。我需要并行执行一系列系统命令(使用反引号)。
除了演示我的问题之外,下面的代码已经被剥夺了任何有意义的东西:
#!/usr/bin/perl -w
use strict;
use threads;
use POSIX;
my @threads = ();
sub timeout {
print "TIMEOUT\n";
foreach my $thread (@threads) {
$thread->kill("ALRM") if $thread->is_running();
}
}
POSIX::sigaction(SIGALRM, POSIX::SigAction->new(\&timeout));
alarm(2);
sub threadsub {
sub handletimeout {
print "KILL\n";
threads->exit(1);
}
POSIX::sigaction(SIGALRM, POSIX::SigAction->new(\&handletimeout));
# while(1) { sleep(1); }
return `sleep 10`;
}
for(my $i=0; $i < 10; $i++) {
push(@threads, thread->create(\&threadsub));
}
foreach my $thread (@threads) {
my $res = $thread->join();
}
现在,问题是当线程在系统调用中被阻塞时,发送给线程的 ALRM 信号永远不会被捕获。如果您取消注释 while 循环,则会按预期捕获信号。我该如何进行这项工作,以便即使线程卡在系统命令中,我也可以使线程超时?
谢谢,
卡斯帕