_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/alarm - suplanuoja SIGALRM

  • alarm SECONDS
  • 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.

algirdas@perl.lt 2005.04.11 - $dabar