Сохраняется ли мой `$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 это имя функции, а не ссылка на код.

Другие вопросы по тегам