地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Perl】アラームでタイムアウト

イディオム的に書いておく。

#!/usr/bin/perl

use strict;
use warnings;

local $@;
eval {
    local $SIG{ALRM} = sub { die "timeout!!\n"; };
    alarm 2;
    sleep 3; # 時間のかかる処理
    alarm 0;
};
if ( $@ ) {
    print "exception: $@";
}

alarm ${数字}を実行することでalarm(2)が呼び出される。manより抜粋

alarm() は SIGALRM シグナルを seconds 秒後に呼び出したプロセスに配送するように手配する。
seconds がゼロならば、処理待ち (pending) のアラームはすべてキャンセルされる。

今までに設定されていた alarm() は中断される。  

SIGALRMが配送されるので事前にハンドラを設定しておくことでタイムアウトが実装できる。