2009-10-06 6 views
5

In einem Perl-Skript Ich schreibe Ich habe ein Problem, wo ich die INT und QUIT Signale blockieren, führen Sie einen Prozess innerhalb Backticks und dann entsperren die Signale INT und QUIT. Ich möchte verhindern, dass ein INT oder ein QUIT den Kindprozess erreicht und es tötet.Perl: Blocking Signal nicht verzögert wie es sein sollte -> Test Code zur Verfügung gestellt

Das Skript blockiert und entblockiert an den richtigen Stellen im Code, es verzögert jedoch nicht das Signal und führt die Handler aus, die ich konfiguriert habe, während es im Blockiermodus ist, wie viele Referenzen sagen, sollte es. Ich weiß, es ist entsperren, weil ich eine SIGINT vor oder nach dem Block oder Block freigeben kann Befehl und es wird respektiert.

OS: Linux 2.6.30 Perl-Version: 5.8.8

-Code-Schnipsel:

#!/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

Welches Betriebssystem ist das? – hlovdal

+0

OS: Linux 2.6.30 –

+6

Verwenden Sie nicht "System" oder qx (aka Backquotes). Beide richten Signale so ein, wie es die meisten Benutzer wollen. Verwenden Sie stattdessen fork/exec, und dann können Sie Signale präzise steuern. –

Antwort

1

Ich bin so gut wie sicher Randal genagelt dies in einem Kommentar oben, aber der richtige Test Mit strace überprüfen, um zu überprüfen, ob das Signal syscalls, das Sie tatsächlich erwarten, wirklich ist. Wenn Sie auf der Ebene des Systemaufrufs arbeiten, möchten Sie im Allgemeinen vermeiden, dass Sie mit Bibliotheksfunktionen mischen, die sie abstrahieren sollen.

+0

Danke Andy und Randal! Es ist alles fertig und gut jetzt. –