alarm
$_
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
if your
system supports it, or else see select() below. It is not advised 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.
eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required alarm $timeout; $nread = sysread SOCKET, $buffer, $size; alarm 0; }; die if $@ && $@ ne "alarm\n"; # propagate errors if ($@) { # timed out } else { # didn't }