安排在指定的挂钟秒数过去后向该进程发送 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。
可移植性问题:perlport 中的“alarm”。