Perl: CRTL C игнорируется при вызове подпрограммы вместо выхода - PullRequest
0 голосов
/ 01 февраля 2019

Итак, скрипт выглядит примерно так:

use strict;
use warnings;
use Term::ReadLine;

$SIG{'INT'} = 'INT_handler';
sub INT_handler {
  print "[+] Abording\n";
  return home();
}

my $term = Term::ReadLine->new('Simple Perl calc');

sub home {

  my $prompt = "\$> ";
  my $OUT = $term->OUT || \*STDOUT;

  while ( defined ($_ = $term->readline($prompt)) ) {
    my $com = $_;
    print $com."\n";
    if ($com eq 'exit') {
        exit;
    }
  option(); # another subroutine when the input is transferred to
  }
}

home();

что я получаю:

$>                                                                              
[+] Abording
$> # I pushed CRTL C but nothing shows                                                                             
$> # same here

То, чего я хочу достичь, - это возможность перейти на home() без выходаи продолжайте работать $SIG{'INT'}.

Я пробовал некоторые другие методы (метки, используя оператор if), но это займет слишком много времени, потому что ввод используется в длинных процессах

1 Ответ

0 голосов
/ 01 февраля 2019

Вы не должны вызывать home() в вашем обработчике сигналов.

Просто установите флаг, который вы проверяете в своем цикле ввода.Когда возвращается $term->readline(), потому что он был прерван CTRL-C, проверьте, был ли установлен флаг, сбросьте его и продолжайте цикл.

Вот ваш обновленный код:

#!/usr/bin/perl
use strict;
use warnings;

use Term::ReadLine;

$SIG{'INT'} = 'INT_handler';
my $interrupted;
sub INT_handler {
    $interrupted++;
}

my $term = Term::ReadLine->new('Simple Perl calc');

sub home {
    my $prompt = "\$> ";
    my $OUT = $term->OUT || \*STDOUT;

    while ( defined ($_ = $term->readline($prompt)) || $interrupted ) {
        if ($interrupted) {
            $interrupted = 0;
            print "\n[+] Aborting\n";
            next;
        }
        my $com = $_;
        print $com."\n";
        if ($com eq 'exit') {
            exit;
        }
    }
}

home();

exit 0;

Результаты теста:

$ perl dummy.pl
$> test
test
$> ^C

[+] Aborting
$> ^C

[+] Aborting
$> sdasd^C

[+] Aborting
$> exit
exit

ПРИМЕЧАНИЕ: Кажется, что есть еще одна проблема: вам нужно нажать клавишу возврата, чтобы получить приглашение обратно.Возможно, это связано с тем, как Term::Readline работает.

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