die en cas de SIGALRM

Le
Denis
Bonjour,

A l'intrieur 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,

--
Denis
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sébastien Cottalorda
Le #128339
Bonjour,

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
Le #128337
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
Le #128205
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.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)

Publicité
Poster une réponse
Anonyme