Проблемы с $SIG{WINCH} при использовании его в модуле

Когда я использую этот модуль в скрипте, if ( $size_changed ) { остается ложным, когда я изменил размер терминала.
Когда я копирую код из модуля непосредственно в сценарии (чтобы мне не нужно было загружать модуль), он работает как положено.
Что может быть такого, что загрузка кода как модуля не работает?

use warnings;
use 5.014;
package My_Package;
use Exporter 'import';
our @EXPORT = qw(choose);

my $size_changed;
$SIG{WINCH} = sub { $size_changed = 1; };

sub choose {
    # ...
    # ...
    while ( 1 ) {
        my $c = getch();
        if ( $size_changed ) {
            write_screen();
            $size_changed = 0;
            next;
        }
        # ...
        # ...
    }
}

2 ответа

Решение

Я думаю, что нашел причину: помимо этого модуля я загружаю второй модуль, который использует $SIG{WINCH} тоже.
Когда я не загружаю второй модуль choose подпрограмма работает как положено.

Почему вы изменяете переменную и ждете ее в бесконечном цикле?

Не было бы лучше, если бы вы вызывали этот саб из обработчика сигнала напрямую?

$ SIG {WINCH} = sub {print STDERR "WINCH! \ N"; выбрать (); };

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

Может быть, это работает в модуле

local $size_changed;
BEGIN{
   $SIG{WINCH} = sub { $size_changed = 1; };
}

Просто предположение: попробуйте использовать Perl::Unsafe::Signals.

use Perl::Unsafe::Signals;
Другие вопросы по тегам