Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

die en cas de SIGALRM

3 réponses
Avatar
Denis
Bonjour,

A l'int=E9rieur d'un module, je cherche =E0 obtenir qu'un traitement
provoque un die() s'il dure plus de 20 secondes (boucle infinie) :

#################
$SIG{ALRM} =3D 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=F9 est mon erreur ?

Merci,

--=20
Denis

3 réponses

Avatar
Sébastien Cottalorda
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

Avatar
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


Avatar
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.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/&gt; <http://www.dotandco.com/&gt;