安排在指定時鐘秒數經過後,傳送 SIGALRM 給此處理程序。如果未指定 SECONDS,則會使用儲存在 $_
中的值。(很不幸地,在某些機器上,經過的時間可能會比您指定的少或多一秒,這是因為秒數的計算方式,而處理程序排程可能會進一步延遲訊號傳遞。)
一次只能計時一次。每次呼叫都會停用前一次計時,而可以提供 0
的引數來取消前一次計時,而不啟動新的計時。傳回的值是前一次計時剩餘的時間量。
對於細緻度小於一秒的延遲,Time::HiRes 模組 (來自 CPAN,從 Perl 5.8 開始成為標準發行的一部分) 提供 ualarm
。您也可以使用 Perl 的四個引數版本 select
,讓前三個引數未定義,或者如果您系統支援,您可能可以使用 syscall
介面存取 setitimer(2)。有關詳細資訊,請參閱 perlfaq8。
通常將 alarm
和 sleep
呼叫混用是一個錯誤,因為 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。