2012-11-20 4 views
1

스레드 내에서 시간 초과를 처리하려고합니다. 내 스크립트에는 4 개의 스레드가 있고, 각 스레드는 명령을 실행해야하며 너무 오래 걸리면 명령 프로세스를 중단시킵니다.스레드 내에서 하위 프로세스를 올바르게 종료하는 방법은 무엇입니까?

는 내가 뭐하는 거지 것은 :

my $pid; 
if (!($pid = fork)) 
    {                                                 
    my $pid2; 
    if (!($pid2 = fork)) 
     { 
     exec_cmd $command; 
     } 
    local $SIG{ALRM} = sub {kill 9, $pid2;}; 
    alarm $timeout; 
    waitpid $pid2, 0; 

    exit(0); 
    } 
    waitpid $pid, 0; 
    $ret = $?; 

이는 스레드 내에서 실행되므로 아이의 종료는 다른 스레드는 여전히 결합되지 않은 때입니다. 나는 펄 스레드에서 양산 자식 프로세스의 실행에 시간 제한을 적용하고, 그 아이의 종료 코드를 캡처 할 수있는 방법

+1

이 코드는 스레드가 아닌 포크를 사용합니다. –

+0

예하지만 스크립트의 일부일 뿐이므로이 코드는 스레드 내부에서 호출됩니다. – Robin

+0

질문은 무엇입니까? – pilcrow

답변

2

난 당신이 요구하는 생각 ?

my $pid = fork(); 
if (defined($pid) and $pid == 0) { 
    alarm($timeout); # Preserved across exec() 
    exec(...); 
    die "exec(): $!"; 
} 

종료 상태가 여전히 평소처럼 waitpid/$?에서 사용할 수 있습니다 : 당신은 (UNIX 시스템에서)을 할 수

가장 쉬운 것은 자식 프로세스 자체에 알람을 설정하는 것입니다.

멀티 스레딩 중에 가장 안전한 방법은입니다. 애플리케이션과 구현 모두 위험합니다. 자식이 부모 스레드의 복사본을 실행하기 때문에 응용 프로그램입니다. 그렇게 할 때 threads에서 "불균형 범위/저장/tmps/컨텍스트"오류를 강요하기가 상대적으로 쉽기 때문에 구현합니다.

+0

어떻게 포크없이 스레드 내에서 명령을 시간 종료합니까? exec를 통해 경보가 유지되면 작동하지만 안전하지 않은 경우 다른 해결책이 필요할 수도 있습니다. 무엇이 효과가 있을까요? – Robin

관련 문제