В чем разница между игнорированием сигнала и говорю это не делать ничего в Perl?

голоса
6

Если я скажу Perl явно игнорировать сигнал, SIGINT не имеет никакого эффекта:

$SIG{INT} = 'IGNORE';
my $count = 0;
say $count++ and sleep 1 while 1;

Затем нажать Control-C, а, очевидно, не имеет никакого эффекта. Если же, с другой стороны, я говорю, что ничего не делать:

$SIG{INT} = sub { };
my $count = 0;
say $count++ and sleep 1 while 1;

Затем нажать Control-C имеет эффект! Он будит программу из сна () вызова и сразу увеличивает значение счетчика. В чем разница между игнорированием сигнала и говорю это не делать ничего?

В моей программе, я хотел бы иметь код , выполняемый на SIGINT, не имея его нарушить что - либо. Я хочу что - то вроде:

$SIG{INT} = sub { say Caught SIGINT!; return IGNORED; };  # runs without disrupting sleep
Задан 28/07/2009 в 14:29
источник пользователем
На других языках...                            


3 ответов

голоса
13

В чем разница между игнорированием сигнала и говорю это не делать ничего?

Ваш «ничего не делать» обработчик еще вызывается , когда подается сигнал, прерывая sleepвызов в этом случае. Пропущенные сигналы, с другой стороны, просто отбрасываются системой, не имеющей никакого влияния на процесс.

Смотрите здесь для C-специфического , но более всеобъемлющего справочника.

Ответил 28/07/2009 в 14:38
источник пользователем

голоса
6

Многие системные вызовы могут быть прерваны доставки сигнала. Как правило , вы можете проверить $!(он же errno) , чтобы увидеть , если это EINTRи принять меры , чтобы вновь попытаться отказавший системный вызов.

Если его важным для вас , что некоторые разделы вашего кода (в этом случае ваш вызов sleep()) не прерывается, то вы можете использовать , POSIX::sigprocmaskчтобы блокировать сигналы , в то время как вы находитесь в вашей критической секции. Любые сигналы , полученные заявки будут поставлены в очередь, пока вы не разблокируете, в какой момент они будут доставлены. Я довольно уверен , что есть некоторые забавная семантика множественные сигналов определенного типа блокируется (я думаю , они могут сливаться в один сигнал).

Вот хороший праймер от IBM на Реентрантной функций, и включает в себя небольшой образец с sigprocmask.

Ответил 28/07/2009 в 16:29
источник пользователем

голоса
1

Не знаю, почему он не работает, как вы ожидаете, но, как правило, когда я пытаюсь выполнить подобные вещи, которые я также улавливают TERM сигнал в дополнение к сигналу INT.

Ответил 28/07/2009 в 14:38
источник пользователем

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