alarm SECONDS
alarm

安排在指定時鐘秒數經過後,傳送 SIGALRM 給此處理程序。如果未指定 SECONDS,則會使用儲存在 $_ 中的值。(很不幸地,在某些機器上,經過的時間可能會比您指定的少或多一秒,這是因為秒數的計算方式,而處理程序排程可能會進一步延遲訊號傳遞。)

一次只能計時一次。每次呼叫都會停用前一次計時,而可以提供 0 的引數來取消前一次計時,而不啟動新的計時。傳回的值是前一次計時剩餘的時間量。

對於細緻度小於一秒的延遲,Time::HiRes 模組 (來自 CPAN,從 Perl 5.8 開始成為標準發行的一部分) 提供 ualarm。您也可以使用 Perl 的四個引數版本 select,讓前三個引數未定義,或者如果您系統支援,您可能可以使用 syscall 介面存取 setitimer(2)。有關詳細資訊,請參閱 perlfaq8

通常將 alarmsleep 呼叫混用是一個錯誤,因為 sleep 可能在您的系統內部以 alarm 實作。

如果您想使用 alarm 為系統呼叫計時,您需要使用 eval/die 配對。您不能依賴警報會導致系統呼叫失敗,並將 $! 設為 EINTR,因為 Perl 會在某些系統上設定訊號處理常式,以重新啟動系統呼叫。使用 eval/die 總是有效,但 "Signals" in perlipc 中給出的警告除外。

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
    my $nread = sysread $socket, $buffer, $size;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n";   # propagate unexpected errors
    # timed out
}
else {
    # didn't
}

更多資訊請參閱 perlipc

移植性問題:"alarm" in perlport