イディオム的に書いておく。
#!/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が配送されるので事前にハンドラを設定しておくことでタイムアウトが実装できる。