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";
Który system operacyjny to jest? – hlovdal
System operacyjny: Linux 2.6.30 –
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. –