alarm - schedule a SIGALRM
alarm SECONDS
alarm
Arranges to have a
SIGALRM delivered to this process after the specified number of seconds have elapsed. If
SECONDS is not specified, the value stored in
$_
is used. (On some machines, unfortunately, the elapsed time may be up to
one second less than you specified because of how seconds are counted.)
Only one timer may be counting at once. Each call disables the previous
timer, and an argument of 0
may be supplied to cancel the previous timer without starting a new one.
The returned value is the amount of time remaining on the previous timer.
For delays of finer granularity than one second, you may use Perl's
syscall() interface to access
setitimer(2)
if your
system supports it, or else see select(). It is usually a mistake to intermix alarm()
and sleep() calls.
If you want to use alarm() to time out a system call you need to use an
eval()/die() pair. You can't rely on the alarm causing the system call to fail with $!
set to EINTR
because Perl sets up signal handlers to restart system calls on some
systems. Using eval()/die() always works, modulo the caveats given in Signals.
eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required alarm $timeout; $nread = sysread SOCKET, $buffer, $size; alarm 0; }; if ($@) { die unless $@ eq "alarm\n"; # propagate unexpected errors # timed out } else { # didn't }
If rather than formatting bugs, you encounter substantive content errors in these documents, such as mistakes in the explanations or code, please use the perlbug utility included with the Perl distribution.