前段时间我遇到了$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}
或者在重建时忘记了什么,我会保存吗?
答案 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
是函数名而不是代码引用的情况。