Perl: Blokkering signalet ikke forsinket som det skal være -> Test koden

stemmer
5

I et Perl-skript skriver jeg Jeg har et problem der jeg blokkere INTog QUITsignaler, gjennomføre en prosess innen backticks, og deretter fjerne blokkeringen INTog QUITsignaler. Jeg ønsker å hindre en INTeller en QUITfra å nå barnet prosessen og drepe den.

Skriptet vellykket blokker og unblocks på de riktige punktene i koden, men det betyr ikke forsinke signalet og kjøre handlers jeg har konfigurert mens den er i blokkeringsmodus så mange referanser sier det skal. Jeg vet det er blokkeringer fordi jeg kan sende en SIGINTfør eller etter blokken eller oppheve blokkering kommando og det blir respektert.

OS: Linux 2.6.30 Perl versjon: 5.8.8

Kodebiter:

#!/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;
Publisert på 06/10/2009 klokken 14:25
kilden bruker
På andre språk...                            


1 svar

stemmer
1

Jeg er alt, men viss Randal spikret dette i en kommentar ovenfor, men den riktige testen er å sjekke med strace å bekrefte at signalet syscalls du forventer å skje faktisk er. Og mer generelt, når du arbeider på systemet samtalen nivå, vil du unngå å blande med biblioteksfunksjoner som er ment å abstrahere dem.

Svarte 06/10/2009 kl. 22:40
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more