Проблема с Perl-сигналом INT - PullRequest
4 голосов
/ 21 января 2011

У меня есть следующий код Perl в Windows ActiveState Perl 5.8

  $SIG{INT}=\&clean;

  ...
  sub clean {

  print 'cleaning...';
  ...
  ...
  exit 0;

  }

но когда я пытаюсь закрыть свою программу с помощью Ctrl ^ c, она вообще не входит в подпочву, может кто-нибудь помочь, почему я что-то пропустил?

Ответы [ 3 ]

3 голосов
/ 21 января 2011

Кажется, что Windows не обеспечивает сигналы, как в Unix.

С man perlwin32:

Обработка сигналов может работать не так, как на платформах Unix (где этоточно так же "веди себя" :).Например, вызов «die ()» или «exit ()» из обработчиков сигналов вызовет исключение, поскольку большинство реализаций «signal ()» в Win32 серьезно ограничены.Таким образом, сигналы могут работать только для простых вещей, таких как установка переменной-флага в обработчике.Использование сигналов через этот порт в настоящее время считается неподдерживаемым.

1 голос
/ 21 января 2011

Я бы сказал нет.Я не вижу ничего плохого в том, что ты делаешь.Я написал тестовую программу, которая на самом деле работает:

#!/usr/bin/perl

use strict;
use warnings;

$SIG{INT}=\&clean;

sub clean {
    print 'caught';
}
sleep 10;

Протестировано в Linux, это работает, как и ожидалось, но у меня нет AS AS под рукой, чтобы попробовать это.Попробуйте сами на своем компьютере.

Кроме того, распечатайте в STDERR, чтобы убедиться, что с буферизацией печати не происходит ничего странного.

0 голосов
/ 09 августа 2011

Я обнаружил, что сценарий, заданный @ijw (изменен так, как показано ниже), не работает в Active State Perl версии v5.10.1:

This is perl, v5.10.1 built for MSWin32-x86-multi-thread
(with 2 registered patches, see perl -V for more detail)

Моя модификация ниже добавляет вызовы автозапускатак как в противном случае спящий режим ниже не будет отображать вывод оператора print во время сна):

#!/usr/bin/perl

use IO;
use strict;
use warnings;

# Set autoflushing on to stdout and stderr.  Otherwise, system() call and stdout output does not show up in proper sequence,
# especially on Windows:
STDOUT->autoflush(1);
STDERR->autoflush(1);

$SIG{INT}=\&clean;

sub clean {
    print "caught\n";
    exit (0);
}

print "before sleep\n";
sleep 100;
print "after sleep and then exiting\n";
exit (0);

Когда я закомментировал следующие строки в этом скрипте выше:

$SIG{INT}=\&clean;

sub clean {
    print "caught\n";
    exit (0);
}

И затемнажимая CTRL-C во время сна, скрипт завершает работу и показывает это сообщение:

Terminating on signal SIGINT(2)

Следовательно, на самом деле оно должно быть истинным (ну, для ActiveState Perl v5.10.1), что man perlwin32 сообщает:

... большинство реализаций «signal ()» в Win32 серьезно ограничены....

Для дальнейшего использования:

  1. perlmonks относится к использованию Win32 :: API для настройкивызов функции SetConsoleCtrlHandler Win32.
  2. Все о SetConsoleCtrlHandler .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...