タイムアウトさせる

back
alarm に秒数をセットし、SIGALRM を発生させる。

--------
#!/usr/bin/perl

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") {
    # SIGALRM
  }
  elsif ($signal eq "INT") {
    # SIGINT
  }
  elsif ($signal eq "TERM") {
    # SIGTRM
  :
  :
  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