sub foo
{
my $handler = sub { my $sig = shift; print STDERR "Caught SIG$sig\n";};
local $SIG{INT} = $handler;
local $SIG{QUIT} = $handler;
local $SIG{HUP} = $handler;
local $SIG{KILL} = $handler;
local $SIG{TERM} = $handler;
{
# do something that shouldn't be interrupted
}
}
(Un des cas d'utilisation de local qui reste raisonnable en perl).
J'aimerais bien mettre une boucle plutot que de repeter 5 fois la
meme chose, mais evidemment, ca ne va pas marcher, puisque le local
va etre local a la boucle.
Je pourrais AUSSI sauvegarder les gestionnaires de signaux et les
restaurer en sortie, mais c'est moche.
Je pourrais meme fabriquer le code qui va bien et le confier a un eval...
encore plus moche!
Quelqu'un aurait une idee brillante ? est-ce qu'il y a moyen d'avoir
un "local -1" qui affecterait les variables du niveau du dessus de
la portee actuelle ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
espie
Ah si, j'ai une autre technique un peu usine a gaz, emuler local avec une classe et un DESTROY. Genre, je pourrais tout mettre dans un objet construit avec un destructeur. Oui, ca fonctionne. Moins usine a gaz ?... #! /usr/bin/perl package Local; sub new { my $class = shift; bless {}, $class; } sub DESTROY { my $self = shift; while (my ($name, $value) = each %$self) { $SIG{$name} = $value; } } sub set { my ($self, $name, $v) = @_; $self->{$name} = $SIG{$name}; $SIG{$name} = $v; } package main; sub bar { my $n = Local->new; for my $sig (qw(INT QUIT)) { $n->set($sig, sub { print STDERR "Caught signal2n"; }); } kill -INT, $$; } sub foo { my $n = Local->new; for my $sig (qw(INT QUIT)) { $n->set($sig, sub { print STDERR "Caught signaln"; }); } bar(); kill -INT, $$; } foo(); kill -INT, $$;
Ah si, j'ai une autre technique un peu usine a gaz, emuler local
avec une classe et un DESTROY.
Genre, je pourrais tout mettre dans un objet construit avec un destructeur.
Oui, ca fonctionne.
Moins usine a gaz ?...
#! /usr/bin/perl
package Local;
sub new
{
my $class = shift;
bless {}, $class;
}
sub DESTROY
{
my $self = shift;
while (my ($name, $value) = each %$self) {
$SIG{$name} = $value;
}
}
sub set
{
my ($self, $name, $v) = @_;
$self->{$name} = $SIG{$name};
$SIG{$name} = $v;
}
package main;
sub bar
{
my $n = Local->new;
for my $sig (qw(INT QUIT)) {
$n->set($sig, sub { print STDERR "Caught signal2n"; });
}
kill -INT, $$;
}
sub foo
{
my $n = Local->new;
for my $sig (qw(INT QUIT)) {
$n->set($sig, sub { print STDERR "Caught signaln"; });
}
Ah si, j'ai une autre technique un peu usine a gaz, emuler local avec une classe et un DESTROY. Genre, je pourrais tout mettre dans un objet construit avec un destructeur. Oui, ca fonctionne. Moins usine a gaz ?... #! /usr/bin/perl package Local; sub new { my $class = shift; bless {}, $class; } sub DESTROY { my $self = shift; while (my ($name, $value) = each %$self) { $SIG{$name} = $value; } } sub set { my ($self, $name, $v) = @_; $self->{$name} = $SIG{$name}; $SIG{$name} = $v; } package main; sub bar { my $n = Local->new; for my $sig (qw(INT QUIT)) { $n->set($sig, sub { print STDERR "Caught signal2n"; }); } kill -INT, $$; } sub foo { my $n = Local->new; for my $sig (qw(INT QUIT)) { $n->set($sig, sub { print STDERR "Caught signaln"; }); } bar(); kill -INT, $$; } foo(); kill -INT, $$;
Benoit Izac
Bonjour, Le 13/07/2019 à 10:30, Marc Espie a écrit dans le message <qgc4qr$1vpq$ :
J'ai un bout de code moyennement elegant. Disons: sub foo { my $handler = sub { my $sig = shift; print STDERR "Caught SIG$sign";}; local $SIG{INT} = $handler; local $SIG{QUIT} = $handler; local $SIG{HUP} = $handler; local $SIG{KILL} = $handler; local $SIG{TERM} = $handler; { # do something that shouldn't be interrupted } } (Un des cas d'utilisation de local qui reste raisonnable en perl). J'aimerais bien mettre une boucle plutot que de repeter 5 fois la meme chose, mais evidemment, ca ne va pas marcher, puisque le local va etre local a la boucle. Je pourrais AUSSI sauvegarder les gestionnaires de signaux et les restaurer en sortie, mais c'est moche. Je pourrais meme fabriquer le code qui va bien et le confier a un eval... encore plus moche! Quelqu'un aurait une idee brillante ? est-ce qu'il y a moyen d'avoir un "local -1" qui affecterait les variables du niveau du dessus de la portee actuelle ?
Ceci semble fonctionner : my @sig = qw(INT QUIT HUP KILL TERM); local @SIG{@sig} = ($handler) x @sig; -- Benoit Izac
Bonjour,
Le 13/07/2019 à 10:30, Marc Espie a écrit dans le message
<qgc4qr$1vpq$1@saria.nerim.net> :
J'ai un bout de code moyennement elegant.
Disons:
sub foo
{
my $handler = sub { my $sig = shift; print STDERR "Caught SIG$sign";};
local $SIG{INT} = $handler;
local $SIG{QUIT} = $handler;
local $SIG{HUP} = $handler;
local $SIG{KILL} = $handler;
local $SIG{TERM} = $handler;
{
# do something that shouldn't be interrupted
}
}
(Un des cas d'utilisation de local qui reste raisonnable en perl).
J'aimerais bien mettre une boucle plutot que de repeter 5 fois la
meme chose, mais evidemment, ca ne va pas marcher, puisque le local
va etre local a la boucle.
Je pourrais AUSSI sauvegarder les gestionnaires de signaux et les
restaurer en sortie, mais c'est moche.
Je pourrais meme fabriquer le code qui va bien et le confier a un eval...
encore plus moche!
Quelqu'un aurait une idee brillante ? est-ce qu'il y a moyen d'avoir
un "local -1" qui affecterait les variables du niveau du dessus de
la portee actuelle ?
Ceci semble fonctionner :
my @sig = qw(INT QUIT HUP KILL TERM);
local @SIG{@sig} = ($handler) x @sig;
Bonjour, Le 13/07/2019 à 10:30, Marc Espie a écrit dans le message <qgc4qr$1vpq$ :
J'ai un bout de code moyennement elegant. Disons: sub foo { my $handler = sub { my $sig = shift; print STDERR "Caught SIG$sign";}; local $SIG{INT} = $handler; local $SIG{QUIT} = $handler; local $SIG{HUP} = $handler; local $SIG{KILL} = $handler; local $SIG{TERM} = $handler; { # do something that shouldn't be interrupted } } (Un des cas d'utilisation de local qui reste raisonnable en perl). J'aimerais bien mettre une boucle plutot que de repeter 5 fois la meme chose, mais evidemment, ca ne va pas marcher, puisque le local va etre local a la boucle. Je pourrais AUSSI sauvegarder les gestionnaires de signaux et les restaurer en sortie, mais c'est moche. Je pourrais meme fabriquer le code qui va bien et le confier a un eval... encore plus moche! Quelqu'un aurait une idee brillante ? est-ce qu'il y a moyen d'avoir un "local -1" qui affecterait les variables du niveau du dessus de la portee actuelle ?
Ceci semble fonctionner : my @sig = qw(INT QUIT HUP KILL TERM); local @SIG{@sig} = ($handler) x @sig; -- Benoit Izac
espie
In article , Benoit Izac wrote:
Ceci semble fonctionner : my @sig = qw(INT QUIT HUP KILL TERM); local @SIG{@sig} = ($handler) x @sig;
OH, je connaissais pas le x pour les "list repetitions", c'est joli.
In article <87o91ykw50.fsf@izac.org>, Benoit Izac <benoit.izac@free.fr> wrote:
Ceci semble fonctionner :
my @sig = qw(INT QUIT HUP KILL TERM);
local @SIG{@sig} = ($handler) x @sig;
OH, je connaissais pas le x pour les "list repetitions", c'est
joli.
[...] J'arrive un peu après la bataille, juste pour dire que ce $handler ne risque pas de fonctionner puisque le signal KILL n'est pas captable (pas plus que STOP). -- Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/> Perl en français - <http://perl.mines-albi.fr/>
J'arrive un peu après la bataille, juste pour dire que ce $handler ne
risque pas de fonctionner puisque le signal KILL n'est pas captable (pas
plus que STOP).
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
[...] J'arrive un peu après la bataille, juste pour dire que ce $handler ne risque pas de fonctionner puisque le signal KILL n'est pas captable (pas plus que STOP). -- Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/> Perl en français - <http://perl.mines-albi.fr/>
[...] J'arrive un peu après la bataille, juste pour dire que ce $handler ne risque pas de fonctionner puisque le signal KILL n'est pas captable (pas plus que STOP).
Tout a fait. Pour ma defense, j'ai des trucs bien standards (capter les signaux usuels, pour entre autres tuer des fils qui vont a voir du mal si je reviens pas sur la bonne effective uid... oui bon deja c'est louche) et des trucs un peu moins (jouer avec __DIE__ et __WARN__ dans certains cas pour faire une trace en sortie tout en utilisant quand meme eval {} parfois...) donc j'ai du rajouter KILL un jour parce qu'un truc chelou se produisait.
In article <874l3ff2mp.fsf@invalid.invalid>,
Paul Gaborit <Paul.Gaborit+news@mines-albi.fr.removethisonlyfordirectmail.invalid> wrote:
J'arrive un peu après la bataille, juste pour dire que ce $handler ne
risque pas de fonctionner puisque le signal KILL n'est pas captable (pas
plus que STOP).
Tout a fait.
Pour ma defense, j'ai des trucs bien standards (capter les signaux usuels,
pour entre autres tuer des fils qui vont a voir du mal si je reviens
pas sur la bonne effective uid... oui bon deja c'est louche)
et des trucs un peu moins (jouer avec __DIE__ et __WARN__ dans certains
cas pour faire une trace en sortie tout en utilisant quand meme eval {}
parfois...) donc j'ai du rajouter KILL un jour parce qu'un truc chelou
se produisait.
[...] J'arrive un peu après la bataille, juste pour dire que ce $handler ne risque pas de fonctionner puisque le signal KILL n'est pas captable (pas plus que STOP).
Tout a fait. Pour ma defense, j'ai des trucs bien standards (capter les signaux usuels, pour entre autres tuer des fils qui vont a voir du mal si je reviens pas sur la bonne effective uid... oui bon deja c'est louche) et des trucs un peu moins (jouer avec __DIE__ et __WARN__ dans certains cas pour faire une trace en sortie tout en utilisant quand meme eval {} parfois...) donc j'ai du rajouter KILL un jour parce qu'un truc chelou se produisait.