2012-08-10 1 views
0

얼마 전에 $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}을이 방법으로 현지화했거나 재구성 할 때 뭔가 잊었습니까?

+3

실제로 어떤 것을 현지화하고 있습니까? 당신은'local'이나'my' 또는'our'를 사용하지 않았습니다. 키워드는 일반적으로 그러한 키워드와 관련이 있습니다. Perl에서 변수는 다르게 선언하지 않는 한 전역 변수로 유지됩니다. 아마도'local $ SIG {WINCH} = sub {$ size_changed = 1; };하지만 틀릴 수도 있습니다. –

+0

perlipc를 감추고있는 중에 나에게'local'을 광고해야한다는 것이 나에게 일어났습니다. –

답변

1

코드 처리기를 설정 한 후 코드가 즉시 while 루프에 들어가서 다른 코드가 실행되지 않도록 설정하거나 새 처리기를 설정하기 때문에이 방법이 효과가 있습니다. while 루프가 종료되면 핸들러는 설정 해제되고 local 덕택에 이전 핸들러가 자동으로 복원됩니다.

더 탄력있는 코드를 보려면 기존 신호 처리기가 있는지 확인하고 호출하십시오. 그렇지 않으면 SIGWINCH 핸들러가있는 다른 모듈이 손상됩니다. 예 : 이 $orig_sigwinch는 함수 이름이 아닌 코드 참조 인 경우를 고려하지 않는

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

참고.

+0

while 루프가 종료 될 때 핸들러가 해제되고'choose' 루틴의 끝에서 핸들러가 해제되는 이유는 무엇입니까? –

관련 문제