indietro

  • alarm SECONDI
  • alarm

    Fa in modo che un SIGALARM sia inviato a questo processo dopo che è trascorso il numero di secondi indicato. Se SECONDI non viene specificato, viene utilizzato il valore memorizzato in $_. (Su alcune macchine, sfortunatamente, il tempo trascorso può essere inferiore o superiore fino a un secondo rispetto al numero specificato a causa del sistema con cui vengono contati i secondi, e lo scheduling [programmazione, NdT] dei processi può ulteriormente ritardare la consegna del segnale).

    Può essere in esecuzione un solo timer alla volta. Ciascuna chiamata disabilita il timer definito in precedenza, ed un argomento di 0 può essere fornito per cancellare il timer precedente senza avviarne uno nuovo. Il valore restituito rappresenta il tempo rimanente sul timer precedente.

    Per intervalli di una granularità più fine, inferiore al secondo, potete utilizzare la versione a quattro argomenti di select(), fornita da Perl, lasciando i primi tre argomenti non definiti. In alternativa potreste essere in grado di servirvi dell'interfaccia syscall per accedere a setitimer(2) se il vostro sistema supporta ciò. Anche il modulo Time::HiRes (da CPAN, e parte della distribuzione standard a partire da Perl 5.8) potrebbe risultare utile.

    Solitamente è un errore mischiare chiamate alarm e sleep. (nel vostro sistema, sleep potrebbe essere essere implementata internamente con alarm)

    Se volete utilizzare alarm per far scadere una chiamata di sistema, dovrete utilizzare una coppia eval/die. Non potete contare sul fatto che alarm faccia fallire la chiamata di sistema impostando $! a EINTR, poiché in alcuni sistemi Perl imposta i gestori dei segnali in modo che riavviino le chiamate di sistema. La soluzione che prevede l'uso di eval/die funziona sempre, a meno degli avvertimenti indicati in perlipc/"Signals" ["Segnali", NdT].

        eval {
    	local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n richiesto
    	alarm $timeout;
    	$nletto = sysread SOCKET, $buffer, $dimensione;
    	alarm 0;
        };
        if ($@) {
    	die unless $@ eq "alarm\n";   # propaga gli errori inattesi
        	# scaduto
        }
        else {
        	# non scaduto
        }

    Per maggiori informazioni consultate perlipc.