A l'intérieur d'un module, je cherche à obtenir qu'un traitement provoque un die() s'il dure plus de 20 secondes (boucle infinie) :
################# $SIG{ALRM} = sub { die "timeout"; }; alarm 20; my $line; do { #traitement } until ($traitement_fini); alarm 0; #################
Si j'enleve l'affectation de $SIG{ALRM}, le programme quitte sur un SIGALRM, par contre si je le laisse, la boucle reste infinie.
Où est mon erreur ?
Merci,
Salut,
Il te faut un eval:
$SIG{ALRM} = sub { die "timeout"; }; alarm 20; my $line; eval { #traitement alarm 0; }; if ($@){ print "timeoutn"; }
ATTENTION, n'oublie pas le ';' après le crochet fermant du eval
Sebastien
Denis
J'avais annulé mon message après avoir vu d'où venait le problème, mais apparamment ça n'a pas été pris en compte partout.
A l'intérieur d'un module, je cherche à obtenir qu'un traitement provoque un die() s'il dure plus de 20 secondes (boucle infinie) : Il te faut un eval:
Le eval() empêche le die, ce n'était pas ce que je souhaitais (même
si au final je comptais intégrer mon code à un eval, mais j'ai réduit mon code à la portion intéressante pour poster sur le groupe).
Sinon j'ai trouvé la source du problème, mon traitement consiste à appeller Net::Telnet::cmd() qui redéfinit SIG{ALRM}... je vais trouver un autre moyen pour éviter les boucles infinies.
Merci quand même,
-- Denis
J'avais annulé mon message après avoir vu d'où venait le problème,
mais apparamment ça n'a pas été pris en compte partout.
A l'intérieur d'un module, je cherche à obtenir qu'un traitement
provoque un die() s'il dure plus de 20 secondes (boucle infinie) :
Il te faut un eval:
Le eval() empêche le die, ce n'était pas ce que je souhaitais (même
si au final je comptais intégrer mon code à un eval, mais j'ai
réduit mon code à la portion intéressante pour poster sur le
groupe).
Sinon j'ai trouvé la source du problème, mon traitement consiste à
appeller Net::Telnet::cmd() qui redéfinit SIG{ALRM}... je vais trouver
un autre moyen pour éviter les boucles infinies.
J'avais annulé mon message après avoir vu d'où venait le problème, mais apparamment ça n'a pas été pris en compte partout.
A l'intérieur d'un module, je cherche à obtenir qu'un traitement provoque un die() s'il dure plus de 20 secondes (boucle infinie) : Il te faut un eval:
Le eval() empêche le die, ce n'était pas ce que je souhaitais (même
si au final je comptais intégrer mon code à un eval, mais j'ai réduit mon code à la portion intéressante pour poster sur le groupe).
Sinon j'ai trouvé la source du problème, mon traitement consiste à appeller Net::Telnet::cmd() qui redéfinit SIG{ALRM}... je vais trouver un autre moyen pour éviter les boucles infinies.
Merci quand même,
-- Denis
Patrick Mevzek
Il te faut un eval:
$SIG{ALRM} = sub { die "timeout"; }; alarm 20; my $line; eval { #traitement alarm 0; }; if ($@){ print "timeoutn"; }
Il faut mettre le alarm 0 en dehors de l'eval. Car si le traitement fait un die pour toute autre raison, l'alarm 0 ne sera jamais exécuté, d'où SIGALRM plus loin dans le code... Je me suis déjà fait avoir par ca dans mon code.
$SIG{ALRM} = sub { die "timeout"; };
alarm 20;
my $line;
eval {
#traitement
alarm 0;
};
if ($@){
print "timeoutn";
}
Il faut mettre le alarm 0 en dehors de l'eval.
Car si le traitement fait un die pour toute autre raison, l'alarm 0 ne
sera jamais exécuté, d'où SIGALRM plus loin dans le code... Je me suis
déjà fait avoir par ca dans mon code.
--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
$SIG{ALRM} = sub { die "timeout"; }; alarm 20; my $line; eval { #traitement alarm 0; }; if ($@){ print "timeoutn"; }
Il faut mettre le alarm 0 en dehors de l'eval. Car si le traitement fait un die pour toute autre raison, l'alarm 0 ne sera jamais exécuté, d'où SIGALRM plus loin dans le code... Je me suis déjà fait avoir par ca dans mon code.