2009-10-06 6 views
5

W skrypcie Perla Piszę, że mam problem z blokowaniem sygnałów INT i QUIT, wykonaniem procesu w obrębie odskoków, a następnie odblokowaniem sygnałów INT i . Chcę uniemożliwić INT lub QUIT dotarcie do procesu potomnego i zabicie go.Perl: Sygnał blokujący NIE opóźniony tak jak powinien -> Podany kod testowy

Skrypt pomyślnie blokuje i odblokowuje we właściwych punktach kodu, jednak nie opóźnia sygnału i nie wykonuje uruchomionych procedur obsługi, gdy jest w trybie blokowania, ponieważ wiele odnośników mówi, że powinno. Wiem, że to odblokowanie, ponieważ mogę wysłać SIGINT przed lub po poleceniu blokowania lub odblokowania i jest ono przestrzegane.

OS: Linux 2.6.30 wersja Perl: 5.8.8

Fragmenty kodu:

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

Który system operacyjny to jest? – hlovdal

+0

System operacyjny: Linux 2.6.30 –

+6

Nie używaj "systemu" ani qx (inaczej cytatów). Obaj ustawiają sygnały w sposób, jakiego najbardziej chcą użytkownicy. Zamiast tego użyj fork/exec, a następnie możesz precyzyjnie sterować sygnałami. –

Odpowiedz

1

Jestem niemal pewny Randal przybity tym w komentarzu powyżej, ale test jest właściwa sprawdzić za pomocą strace, aby sprawdzić, czy sygnały, które spodziewasz się uzyskać, faktycznie istnieją. Mówiąc ogólniej, podczas pracy na poziomie wywołania systemowego unika się mieszania z funkcjami bibliotecznymi, które mają na celu ich abstrakcję.

+0

Dziękuję Andy i Randal! Teraz wszystko jest dobrze zrobione. –

Powiązane problemy