|
alarm - schedule a SIGALRM |
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
four-argument version of select() leaving the first three arguments
undefined, or you might be able to use the syscall interface to
access setitimer(2) if your system supports it. The Time::HiRes module
from
CPAN may also prove useful.
It is usually a mistake to intermix alarm and sleep calls.
(sleep may be internally implemented in your system with alarm)
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 in the perlipc manpage.
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
}
|
alarm - schedule a SIGALRM |