Проблема с системной подпрограммой и сигналом INT - PullRequest
2 голосов
/ 27 апреля 2011

У меня есть обработчик сигнала INT в моем скрипте Perl.Он не будет выполняться, когда INT отправляется, когда скрипт Perl находится в середине системного вызова.Почему?

Рассмотрим:

$ perl5.12/bin/perl -E "$(cat <<EOF

    \$SIG{INT} = sub {say q(trapped INT); exit};
    say q(sleeping ...);
    system q(sleep 10000); # INT at this point is not caught by Perl.

EOF)"
sleeping ...

Однако, если я заменю системный вызов на спящий вызов, он будет работать как положено:

$ perl5.12/bin/perl -E "$(cat <<EOF

    \$SIG{INT} = sub {say q(trapped INT); exit};
    say q(sleeping ...);
    sleep 10000; # replaces the system call from above

EOF)"
sleeping ...
trapped INT

Версия Perl:

$ perl5.12/bin/perl -v

This is perl 5, version 12, subversion 3 (v5.12.3) built for x86_64-linux-thread-multi
(with 9 registered patches, see perl -V for more detail)

Copyright 1987-2010, Larry Wall

Binary build 1204 [294330] provided by ActiveState http://www.ActiveState.com
Built Feb  9 2011 14:48:47
...

Ответы [ 2 ]

6 голосов
/ 27 апреля 2011

Вы можете определить, был ли подпроцесс system() убит SIGINT, проверив $?, например:

use POSIX qw(SIGINT);

sub interrupt {
    say "trapped INT";
    exit;
}

$SIG{INT} = \&interrupt;

say "sleeping";
system ("sleep 100");

if (($? & 127) == SIGINT) {
        interrupt();
} elsif ($?) {
        say "subprocess failed, status $?";
}

Perl игнорирует сигналы INT и QUIT во время выполнения внешней команды, см. system().

1 голос
/ 27 апреля 2011

При вызове system () все, что выполняется, контролирует терминал. Отправка любых сигналов на него с помощью клавишных элементов управления будет отправлена ​​выполняющемуся процессу (в этом случае системная команда сна).

Перехват сигналов и выполнение с ними каких-либо действий в скрипте Perl работает только во время работы этого скрипта. Для ловушки в Bash вы можете использовать trap "command" signal:

$ perl -e'system("trap \"echo Trapped\" SIGINT; sleep 10");'
^CTrapped
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...