Perl5 リファレンス



alarm

【文法】

alarm 秒数

【説明】
指定した秒数が経過した後、プロセスに、SIGALRM を伝えます。秒数が指定されない場合
には、$_ の値が適用されます(マシンによっては、秒数の数え方の違いから、経過時間
が、あなたが指定した秒数より 最大 1 秒短くなる場合があります。)。同時にセットで
きるタイマーは 1 つだけです。新たにタイマーをセットすると、前のタイマーは無効に
なってしまいます。秒数に 0 を指定すると、新しいタイマーを開始することなく、前の
タイマーをキャンセルすることができます。戻値は、前のタイマーで残っていた時間です。

1 秒以下の精度を求めるなら、Perl の 4 引数版の select() 関数が使えます。はじめ
の 3 引数を未定義にすればよいのです。もしくは、あなたのシステムがサポートしてい
ればですが、setitimer(2) にアクセスする syscall インタフェースを使うこともできま
す。CPAN から Time::HiRes モジュールが入手可能ですが、これは非常に役に立ちます。

よく、alarm と sleep が混同されがちですが、それは間違いです。(sleep は alarm を
使ってあなたのシステムに内部的に実装されているかもしれません。)

alarm 関数を使ってタイムアウト処理をさせる場合には、eval, die を使う必要がありま
す。システムコールを使って、$! に 'EINTR' をセットして失敗させるアラームをあてに
するこはできません。なぜなら、Perl は、いくつかのシステム上では、システムコール
を再起動するようシグナルハンドラをセットアップするからです。eval, die を使えば、
常に有効です。

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n が必要
    alarm $timeout;
    $nread = sysread SOCKET, $buffer, $size;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n";   # 予期せぬエラーを伝える
    # タイムアウト
}
else {
    # タイムアウトでない
}




Perl5リファレンスに戻る