2009-10-06 5 views
5

Perl 스크립트에서 내가 INTQUIT 신호를 차단하고 백틱 내에서 프로세스를 실행 한 다음 차단을 해제하는 데 문제가 있습니다. INTQUIT 신호. INT 또는 QUIT이 하위 프로세스에 도달하여이를 삭제하지 못하도록하고 싶습니다.Perl : 차단 신호가 지연되지 않음 -> 테스트 코드 제공

스크립트가 코드의 올바른 지점에서 성공적으로 차단 및 차단 해제되지만 신호를 지연시키지 않고 차단 모드에서 구성한 처리기를 실행하지 않습니다. 블록 또는 차단 해제 명령 전후에 SIGINT을 보낼 수 있기 때문에 블록 해제 중임을 알고 존중됩니다.

OS : 리눅스 2.6.30 Perl 버전 : 5.8.8

코드 조각 :

#!/usr/local/bin/perl 

use POSIX qw(:signal_h); 

$SIG{'INT'} = 'gracefulExit'; 
sub gracefulExit { print "Caught Signal = GOOD\n"; exit; } 

print "Recieving a SIGINT works here\n"; 
sleep 5; 
my $sigset = POSIX::SigSet->new; 
my $blockset = POSIX::SigSet->new(SIGINT); 
sigprocmask(SIG_BLOCK, $blockset, $sigset) or die "dying at block...\n"; 
print "Recieving a SIGINT doesn't work here [GOOD!] and is NOT delayed [WHY!?].\n"; 
`/bin/sleep 5`; 
sigprocmask(SIG_UNBLOCK, $blockset) or die "dying at unblock...\n"; 
print "Recieving a SIGINT works here again [GOOD!]\n"; 
sleep 5; 
print "Exited without receiving a signal\n"; 
+0

어떤 운영체제입니까? – hlovdal

+0

OS : Linux 2.6.30 –

+6

"system"또는 qx (backquotes라고도 함)를 사용하지 마십시오. 둘 다 가장 일반적인 사용자가 원하는 방식으로 신호를 설정합니다. 대신 fork/exec를 사용하면 신호를 정확하게 제어 할 수 있습니다. –

답변

1

I 해요 모든 있지만 특정 랜달은 위의 코멘트에이 박혀 있지만, 적절한 테스트입니다 strace로 검사하여 실제로 일어날 것으로 예상되는 신호 시스템 호출이 있는지 확인하십시오. 더 일반적으로, 시스템 콜 레벨에서 작업 할 때, 당신은 그것들을 추상화하려는 라이브러리 함수와 섞이는 것을 피하고자합니다.

+0

감사합니다. Andy and Randal! 이제 다 잘되었습니다. –