Проблемы с $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;