Это работает так, как ожидалось, поскольку Perl 5.10.1: SIGINT находятся в ловушке.Обработчики сигналов Perl сбрасываются в END-блоках
#!/usr/bin/perl
use strict;
use warnings;
$SIG{INT} = sub { die "Caught a sigint $!" };
sleep(20);
Но здесь SIGINTs являются не в ловушке.
#!/usr/bin/perl
use strict;
use warnings;
$SIG{INT} = sub { die "Caught a sigint $!" };
END {
sleep(20);
}
Это может быть исправлено путем установки обработчика снова в END
блоке, например, так:
END {
$SIG{INT} = sub { die "Caught a sigint $!" };
sleep(20);
}
Но это не будет работать, если у вас есть более одного блока: обработчики должны быть установлены снова для каждого блока.
Я попытался понять это, и я не могу найти объяснение на perldoc. Единственное упоминание об этом поведении я могу найти, это сноска от Practical Perl Programming A D Marshall 1999-2005
Примечание Сигналы, которые отправляются на ваш скрипт, могут обходить блоки END.
Кто-нибудь объяснит это?
работает нормально на 5.24 (кажется). У вас нет времени на тестирование, но что произойдет, если вы поместите обработчик sig в блок BEGIN на 5.10 ... это что-то изменит? Я надеюсь и не думаю ... – stevieb
Я проверил его снова с 5.22 дома, и у меня такое же поведение. Запустите затем Ctrl-C -> Caught ..., с конечным блоком:. Что касается блока BEGIN, на 5.22, установка обработчика там получает сигналы, пойманные, но с блоком END тоже сигналы все еще не пойманы. –
gxtaillon
Ты абсолютно прав. Я ошибался. Обработчик sig не поймает должным образом, даже в 5.24, как я сказал ранее. Я думал, что раньше делал это в коде, но почему-то я начинаю сомневаться в этом, так как не могу заставить его работать над несколькими perlbrew экземплярами. – stevieb