タイムアウトさせる
back
alarm に秒数をセットし、SIGALRM を発生させる。
--------
alarm 5;
$SIG{TERM} = \&catch_sig;
$SIG{INT} = \&catch_sig;
$SIG{ALRM} = \&catch_sig;
while(1) {
print "loop\n";
sleep(1);
}
sub catch_sig {
my $signal = shift;
if ($signal eq "ALRM") {
}
elsif ($signal eq "INT") {
}
elsif ($signal eq "TERM") {
:
:
print "process stoped\n";
exit 0;
}
--------
"C-c" or "kill" or "5秒後" に停止
※ catch_sig サブルーチンで exit しなかった場合は止まらない
タイムアウトをキャンセルするには、引数の数値を 0 にする。
例えば、処理に時間がかかりがちの箇所は alarm sec を仕掛けておき、
時間のかかる処理が無事すんだ後に、タイムアウトをキャンセルすればより良い(かもしんない)
$SIG{ALRM} = \&timeout;
alarm 60;
alarm 0;
sub timeout {
}
back