2011-03-10 1 views
2

system()으로 호출 된 반복 작업을 일괄 처리하기 위해 Perl 스크립트를 사용하고 싶습니다. 무언가 잘못되어이 스크립트를 중단하고 싶다면,^C는 쉘에 의해 캡쳐되고, 어떤 작업이든지 중단되며, Perl 스크립트는 다음 스크립트와 함께 즐겁게 진행됩니다.perl이 shell - interrupt를 호출합니다. C가 perl이 아닌 셸을 중지합니다.

인터럽트가 Perl 스크립트를 중지하도록 작업을 호출 할 수있는 방법이 있습니까?

답변

5

system의 반환 값을 확인하지 않습니다. 부모 프로그램에 추가 : 예상대로

use autodie qw(:all); 

과 프로그램이 중단됩니다

"…" died to signal "INT" (2) at … line … 

당신은 당신의 자신의 업을 청소하거나 다른 메시지를 사용하기 위해 Try::Tiny이 예외를 잡을 수 있습니다. 당신은 시스템에 의해 실행 된 명령 신호 2 (INT) 사망 여부를 확인하기 위해 $?을 확인할 수 있습니다

9

: 따라서

my $rc=system("sleep 20"); 
my $q=$?; 
if ($q == -1) { 
    print "failed to execute: $!\n" 
} elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
      ($q & 127), ($q & 128) ? 'with' : 'without'; 
} else { 
    printf "child exited with value %d\n", $q >> 8; 
} 
# Output when Ctrl-C is hit: 
# child died with signal 2, without coredump 

정확한 당신이 원하는 확인 : 여기

$?을 구문 분석의 전체 예제 :

my $rc=system("sleep 20"); 
my $q=$?; 
if ($q != -1 && (($q & 127) == 2) && (!($? & 128))) { 
     # Drop the "$? & 128" if you want to include failures that generated coredump 
    print "Child process was interrupted by Ctrl-C\n"; 
} 

참고 : $?에 대한 perldoc system 취급 및 system() 전화; $?

에 대한 자세한 내용은 perldoc perlvar