alarm
Paruošia SIGALRM pristatyti einamajam procesui praėjus nustatytam skaičiui sekundžių. Jei SECONDS nepažymėtos, naudojama reikšmė, laikoma $_
. (Kai kur, deja, laikas gali būti viena sekunde mažiau ar daugiau nei nustatyta, priklausomai nuo to, kaip skaičiuojamos sekundės o proceso numatymas gali pristatyti signalą dar vėliau.)
Tik vienas laikmatis gali vienu metu skaičiuoti laiką. Kiekvienas kvietimas panaikina prieš tai buvusį laikmatį, o argumentas 0
gali būti aprašytas ankstesnio taimerio anuliavimui, nepradedant naujo. Gražinta reikšmė yra praeito laikmačio likusio laiko kiekis.
Dėl vėlavimų, mažesnių nei viena sekundė, galima naudoti Perl'o keturių argumentų select() funkcijos versiją, paliekant neaprašytus pirmus tris argumentus, arba galima naudoti syscall
interfeisą, kad pasiekti setitimer(2), jei jį sistema palaiko. Time::HiRes
modulis (iš CPAN, pradedant Perl 5.8 dalimi standartinės distribucijos) taip pat gali būti naudingas.
Dažniausiai būna klaida sumaišyti alarm
ir sleep
kreipimusis.
(sleep
gali būti sistemoje su alarm
)
Jei norima naudoti alarm
sisteminio kvietimo pertraukimą, reikia daryti eval
/die
porą. Negalima pasitikėti vien aliarmu, priverčiančiu sisteminį kvietimą baigtis su $!
nustatytų kaip EINTR
, nes Perl nustato signalo handlerius iš naujo paleisti sisteminius kvietimus (kai kuriose sistemose). Naudojant eval
/die
visada suveikia, išskyrus įspėjimus, duotus "Signals"
perlipc.
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n būtinas
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # perduoti nenumatytas klaidas
# laikas baigėsi
}
else {
# laikas nesibaigė
}
Daugiau informacijos perlipc.