2009-09-06 2 views
-1

:왜 내 HUP 신호 처리기가 Perl의 전역 변수를 업데이트하지 않습니까? 나는 다음과 같은 일을 해요

# First i install a signal handler for HUP which sets a global flag. 
$SIG{"HUP"} = sub { print "HUP received\n"; $received_hup = 1 }; 
# Now i wait for HUP to be received. 
my $cnt = 0; 
for ($cnt = 0; $received_hup != 1 and $cnt < 900; $cnt++) { 
    sleep(1); 
} 
print ($received_hup == 1) ? "true" : "false"; 

그런 다음 나는이 펄 프로세스에 HUP를 보내

나는 다음이있는 펄 스크립트를 실행합니다.

"HUP 수신"이 인쇄 될 때마다 가끔 false가 인쇄되는 것을 발견했습니다. 즉 신호 처리기가 호출 되더라도 전역 변수는 수정되지 않습니다.

필자는 Perl의 동시성 문제에 익숙하지 않으므로 안내해 주시기 바랍니다.

답변

5

음, 첫째, 오프는 실제로 당신이 한 쌍을 인쇄에 괄호가 누락하고 있기 때문에 프로그램이 "거짓"인쇄 가능 : 여분의 쌍없이

print (($received_hup == 1) ? "true" : "false"); 

그것으로 분석, :

(print($received_hup == 1)) ? "true" : "false"; 

이것은 분명히 원하는 것이 아닙니다.

그 테스트 프로그램은 올바른 괄호로 수정되었습니다. 데비안 리눅스 w/perl 5.10에서 잘 작동합니다. 100 번 이상 시도하고 "HUP 수신"및 "사실"을 인쇄 할 때마다 시도했습니다. 그 정확한 테스트 프로그램이 당신을 위해 작동하지 않는다면, 나는 당신이 perl의 버그 버전을 가지고 있다고 생각합니다. 필자가 생각하기에 5.8 이전의 perl의 구버전은 신호 처리 문제가 있었다.

+4

경고가 활성화 된 경우 경고가 표시되었다고 추가 할 수 있습니다. – ysth

관련 문제