[bcn-pm] Sys::AlarmCall

Jose Luis Perez Diez jluis a escomposlinux.org
dic abr 1 04:55:12 PDT 2009


El Wednesday, 1 de April de 2009 11:48:43 Arnau Bria va escriure:
> suposo que m'hauràs contestat a la meva pregunta inicial, però no se si
> l'he entès :-) m'estàs dient que eval ignora els meus exits, no?

No el eval fa cas als teus exits i per tant surt crida executa els blocks END 
que toquin i acaba el process 

> realment ell surt per block END independentment de com jo vulgui
> sortir... és això?

Si vols controlar la sortida fes sevir die() i tindràs oportunitat de que el 
programa sobrevisquifile:///tmp/kde-jpddb/kontactjVeR8g//test.pl

> Aleshores, si jo vull:
>
> 1.-) executar una funció i fer un exit 2 en cas d'error

si vols treballar amb el error al codi que crida la funció no pots fer exit  
has de sortir amb return,  o amb die i tractar l'excepció , o fer fork i 
comprovar el valor de retorn del fill.

> 2.-) controlar l'execució d'aquesta funció amb timeout
>
> ho puc fer amb alarm_call?
> com haig d'atrapar els errors dintre de la funció?

Canviant els exit 2 per die 2 hauria de funcionar mira aquest codi:

#!/usr/bin/perl

use strict;
use warnings;

use Sys::AlarmCall;

$Sys::AlarmCall::TIMEOUT = -1;

sub tempusfugit {
	my $temps = rand;
 	print"return ";
        sleep($temps+.5);

        return ($temps*100 % 2) ?2:0; 

}

sub tempsmort{
        my $temps = rand;
        print"Mortis ";
        sleep($temps+.5);

       die 2 if ($temps*100 % 2);
       return 0;
}


sub que { 
	return "error\n" if ($_ == 2);
        return "timeout\n" if ($_ == -1);
	return "$_\n";
}

print que (alarm_call(1, sub { tempusfugit })) for (1..10);

print que (alarm_call(1, sub { tempsmort })) for (1..10);




Més informació sobre la llista de correu Barcelona-pm