一見単純な問題があります。一連のシステムコマンド(バッククォートを使用)を並行して実行する必要があります。
以下のコードは、私の問題を示す以外に意味のあるものをすべて取り除いています。
#!/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ループのコメントを外すと、信号は意図したとおりにキャッチされます。システムコマンドでスタックしている場合でもスレッドをタイムアウトできるように、これを機能させるにはどうすればよいですか?
ありがとう、
キャスパー