Perl: сигнал блокировки НЕ задерживается, как положено -> предоставлен тестовый код - PullRequest
5 голосов
/ 06 октября 2009

В скрипте 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";

1 Ответ

1 голос
/ 07 октября 2009

Я почти уверен, что Рэндал прибил это в комментарии выше, но правильный тест - проверить с помощью strace, чтобы убедиться, что сигнальные системные вызовы, которые вы ожидаете, действительно происходят. И вообще, работая на уровне системных вызовов, вы хотите избежать смешивания с библиотечными функциями, предназначенными для их абстрагирования.

...