2009-10-06 5 views
5

Dans un script Perl que j'écris, j'ai un problème où je bloque les signaux INT et QUIT, exécute un processus à l'envers, puis débloque les signaux INT et QUIT. Je veux empêcher un INT ou un QUIT d'atteindre le processus enfant et de le tuer.Perl: Blocage du signal PAS retardé comme il se doit -> Code de test fourni

Le script bloque et débloque avec succès les bons points dans le code, cependant, il ne retarde pas le signal et exécute les gestionnaires que j'ai configurés alors qu'il est en mode de blocage comme le disent de nombreuses références. Je sais que c'est débloquer parce que je peux envoyer un SIGINT avant ou après la commande de blocage ou de déblocage et il est respecté.

OS: Linux 2.6.30 version Perl: 5.8.8

extraits de code:

#!/usr/local/bin/perl 

use POSIX qw(:signal_h); 

$SIG{'INT'} = 'gracefulExit'; 
sub gracefulExit { print "Caught Signal = GOOD\n"; exit; } 

print "Recieving a SIGINT works here\n"; 
sleep 5; 
my $sigset = POSIX::SigSet->new; 
my $blockset = POSIX::SigSet->new(SIGINT); 
sigprocmask(SIG_BLOCK, $blockset, $sigset) or die "dying at block...\n"; 
print "Recieving a SIGINT doesn't work here [GOOD!] and is NOT delayed [WHY!?].\n"; 
`/bin/sleep 5`; 
sigprocmask(SIG_UNBLOCK, $blockset) or die "dying at unblock...\n"; 
print "Recieving a SIGINT works here again [GOOD!]\n"; 
sleep 5; 
print "Exited without receiving a signal\n"; 
+0

De quel système d'exploitation s'agit-il? – hlovdal

+0

OS: Linux 2.6.30 –

+6

N'utilisez pas "system" ou qx (alias backquotes). Les deux mettent en place des signaux d'une manière que les utilisateurs les plus communs veulent. Utilisez à la place fork/exec, et vous pouvez contrôler les signaux avec précision. –

Répondre

1

Je suis presque certain Randal clouée cela dans un commentaire ci-dessus, mais le critère est pour vérifier avec strace pour vérifier que les appels système de signal que vous prévoyez être en train de se produire sont effectivement. Et plus généralement, lorsque vous travaillez au niveau des appels système, vous voulez éviter de mélanger avec les fonctions de la bibliothèque qui sont destinées à les abstraire.

+0

Merci Andy et Randal! Tout est fait et bien maintenant. –

Questions connexes