Сохраняется ли мой `$SIG{WINCH}`, если я его локализую?
Некоторое время назад у меня были проблемы с $SIG{WINCH}
потому что я загрузил два модуля, которые оба использовали $SIG{WINCH}
Проблемы с $SIG{WINCH} при использовании его в модуле. Сейчас я попытался восстановить этот случай, но на этот раз я положил в один модуль $SIG{WINCH}
в подпрограмме.
use warnings;
use strict;
package My_Package;
use Exporter 'import';
our @EXPORT = qw(choose);
sub choose {
# ...
my $size_changed;
local $SIG{WINCH} = sub { $size_changed = 1; }; # edit: added "local"
while ( 1 ) {
my $c = getch();
if ( $size_changed ) {
write_screen();
$size_changed = 0;
next;
}
# ...
}
}
Теперь похоже, что это работает. Я спасу, если я локализую $SIG{WINCH}
таким образом или я что-то забыл при реконструкции?
1 ответ
Это работает, потому что ваш код сразу вводит while
цикл после установки обработчика сигнала, поэтому никакой другой код не запускается (или не устанавливает новый обработчик). Когда цикл while завершается, ваш обработчик сбрасывается, а старый восстанавливается автоматически благодаря local
,
Для более гибкого кода я бы проверил, существует ли существующий обработчик сигнала, и вызову его. В противном случае любой другой модуль, имеющий обработчик SIGWINCH, будет поврежден. Например
my $orig_sigwinch = $SIG{WINCH};
local $SIG{WINCH} = sub {
$orig_sigwinch->() if $orig_sigwinch && ref $orig_sigwinch eq 'CODE';
$size_changed = 1;
}
Обратите внимание, что это не учитывает случай, когда $orig_sigwinch
это имя функции, а не ссылка на код.