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";
Welches Betriebssystem ist das? – hlovdal
OS: Linux 2.6.30 –
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. –