[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