Могу ли я установить единый обработчик сигналов для всех сигналов в Perl? - PullRequest
8 голосов
/ 01 октября 2010

Возможно ли в Perl установить только один обработчик сигналов для всех сигналов, которые он получает? Причина этого в том, что я не знаю, какой сигнал мой Perl-код получит во время выполнения. Один из способов, который я вижу, - это указать все доступные сигналы на моем пользовательском обработчике сигналов, но я не хочу идти по этому пути. Есть ли простой способ сделать это? что-то вроде:

$SIG{'ALL'} = 'sigHandler';

Ответы [ 3 ]

12 голосов
/ 01 октября 2010

Вы действительно не хотите этого делать.Устанавливайте обработчики сигналов только для сигналов, которые вам нужно обрабатывать иначе, чем по умолчанию (с чем мы не можем вам помочь, поскольку вы не упоминаете, какое приложение вы пишете).

В большинстве обычных случаев,вам вообще не нужно писать обработчики сигналов - настройки по умолчанию настроены именно на то, что вам нужно.Вы должны прочитать perldoc perlipc прямо сейчас , чтобы вы знали, какие у вас случаи отличаются от нормальных.

Вы можете изменить более одного сигнала одновременно с помощью sigtrap pragma : полезно для добавления обработчиков для нормально необработанных сигналов или для более строгой обычной обработки ошибок.

# install a trivial handler for all signals, as a learning tool
use sigtrap 'handler' => \&my_handler, 'signal';
sub my_handler
{
    print "Caught signal $_[0]!\n";
}
6 голосов
/ 01 октября 2010
$SIG{$_} = 'sigHandler' for keys %SIG;

Если вы хотите относиться к __WARN__ и __DIE__ по-разному,

use Config;
$SIG{$_} = 'sigHandler' for split ' ', $Config{sig_name};
3 голосов
/ 01 октября 2010

с макушки головы,

foreach my $key (keys %SIG) {
    $SIG{$key} = \&sighandler
}

Это, вероятно, плохая идея. Вы должны ловить только те сигналы, которые вы знаете, вы можете справиться. Различные сигналы не должны обрабатываться одинаково. Вы действительно хотите, чтобы SIGINT обрабатывался так же, как, например, SIGCHILD? SIGHUP? SIGUSR1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...