В скрипте Perl, который я пишу, у меня возникла проблема, когда я блокирую сигналы INT
и QUIT
, выполняю процесс в обратных тиках, а затем разблокирую сигналы INT
и QUIT
. Я хочу, чтобы INT
или QUIT
не достигли дочернего процесса и не убили его.
Сценарий успешно блокирует и разблокирует правильные точки в коде, однако он не задерживает сигнал и не выполняет обработанные мной обработчики, пока он находится в режиме блокировки, как утверждают многие ссылки. Я знаю, что это разблокирование, потому что я могу отправить SIGINT
до или после команды блокирования или разблокирования, и это соблюдается.
ОС: Linux 2.6.30
Версия Perl: 5.8.8
Фрагменты кода:
#!/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";