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

可移植性问题:perlport 中的“alarm”