2011-04-27 2 views
0

Perl 스크립트에 INT 신호 처리기가 있습니다. Perl 스크립트가 시스템 호출 중에 INT가 전송되면 실행되지 않습니다. 왜?시스템 서브 루틴 및 INT 신호 문제

고려 :

$ perl5.12/bin/perl -E "$(cat <<EOF 

    \$SIG{INT} = sub {say q(trapped INT); exit}; 
    say q(sleeping ...); 
    system q(sleep 10000); # INT at this point is not caught by Perl. 

EOF)" 
sleeping ... 

을하지만, 나는 잠 호출로 시스템 호출을 대체하는 경우, 그것은 예상대로 작동합니다

$ perl5.12/bin/perl -E "$(cat <<EOF 

    \$SIG{INT} = sub {say q(trapped INT); exit}; 
    say q(sleeping ...); 
    sleep 10000; # replaces the system call from above 

EOF)" 
sleeping ... 
trapped INT 

펄 버전은 다음과 같습니다

$ perl5.12/bin/perl -v 

This is perl 5, version 12, subversion 3 (v5.12.3) built for x86_64-linux-thread-multi 
(with 9 registered patches, see perl -V for more detail) 

Copyright 1987-2010, Larry Wall 

Binary build 1204 [294330] provided by ActiveState http://www.ActiveState.com 
Built Feb 9 2011 14:48:47 
... 

답변

5

system() 하위 프로세스가 SIGINT에 의해 살해되었는지 여부를 체크인으로 확인할 수 있습니다. 이런 g $? : 외부 명령이 실행되는 동안

use POSIX qw(SIGINT); 

sub interrupt { 
    say "trapped INT"; 
    exit; 
} 

$SIG{INT} = \&interrupt; 

say "sleeping"; 
system ("sleep 100"); 

if (($? & 127) == SIGINT) { 
     interrupt(); 
} elsif ($?) { 
     say "subprocess failed, status $?"; 
} 

INTQUIT 신호 펄 무시, system() 참조.

1

system()을 호출 할 때 실행중인 모든 작업이 터미널을 제어합니다. 키보드 컨트롤을 통해 신호를 보내는 것은 실행중인 프로세스 (이 경우 시스템의 sleep 명령)로 전송됩니다.

Perl 스크립트에서 신호를 트래핑하고이를 처리하는 것은 해당 스크립트가 실행되는 동안에 만 작동합니다. 당신이 trap "command" signal 사용할 수 있습니다 배쉬에 함정이려면 그 사실이라면

$ perl -e'system("trap \"echo Trapped\" SIGINT; sleep 10");' 
^CTrapped 
+0

을, 다음은^C에 대한 응답으로 경고하지 것이다 :'IPC :: 된 Open3을 사용; $ SIG {INT} = sub {warn ("INT")}; open3 ('<&STDIN', '> & STDOUT', '> & STDERR', q {perl -e '$ SIG {INT} = "무시"; sleep 5'}); 1 while! waitpid (-1, 0) && $! {EINTR}; ' – ikegami

+1

Andy가 언급했듯이, 핸들러가 호출되지 않는 이유는'system'이 그것의 실행 중에'SIGINT'와'SIGQUIT'를'IGNORE'로 설정한다는 것입니다. – ikegami

관련 문제