如果我本地化它,我的`$ SIG {WINCH}`保存吗?

时间:2012-08-10 14:17:33

标签: perl signals localized

前段时间我遇到了$SIG{WINCH}的问题,因为我加载了两个使用$SIG{WINCH} Problems with $SIG{WINCH} when using it in a module的模块。 现在我试图重建这个案例,但这次我在一个子程序中放入了一个$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 个答案:

答案 0 :(得分:1)

这是有效的,因为您的代码在设置信号处理程序后立即进入while循环,因此没有其他代码可以运行(或设置新的处理程序)。当while循环退出时,您的处理程序将被取消设置,并且由于local而自动恢复旧处理程序。

对于更具弹性的代码,我会检查现有的信号处理程序是否存在,并调用它。否则,任何其他具有SIGWINCH处理程序的模块都将被破坏。 E.g。

my $orig_sigwinch = $SIG{WINCH};
local $SIG{WINCH} = sub {
    $orig_sigwinch->() if $orig_sigwinch && ref $orig_sigwinch eq 'CODE';
    $size_changed = 1;
}

请注意,这不考虑$orig_sigwinch是函数名而不是代码引用的情况。