2016-09-21 3 views
2
의 + 가능성

시나리오 : -> 핵심펄하여 여러개의 ALRM 신호

부모 프로세스가 N 노동자의 아이들이 테이블을 무대로 데이터를로드 할 산란, 그리고 부모 자주 (매 15 분)하여야한다 무대에서 날짜를 이동하는 저장 프로 시저를 호출

아이디어 :'$ SIG {ALRM}' 처리기를 15 분마다 설정하고 신호 처리기에서 저장 프로 시저를 호출 할 것을 계획합니다.

신호 처리기가 실행 시간이 ~ 5 분이되어야하는 저장 프로 시저를 호출하도록 설정하는 것이 좋습니다. 다른 ALRM 신호가 꺼질 때 저장 프로 시저가 15 분을 초과하여 실행되는 경우 어떻게되는지 궁금합니다.

이 제 2 신호는
  • 나중에 처리 할 이전 핸들러가 여전히 실행되는 동안
  • 가 완전히
  • 다른 핸들러 및 저장 프로 시저 인스턴스를 호출 분실 대기 얻을 것인가.

답변

2

당신은 당신이

$SIG{ALRM} = sub { 
    alarm(15*60); 
    call_stored_proc(); 
}; 

alarm(15*60); 

call_stored_proc가하게는 15 분 이상 걸리는 경우 어떻게되는지 묻는 것입니다. 왜 그냥 해보지 않은거야?

perl -e' 
    use feature qw(say); 

    my $slow = 2; 
    my $done = 0; 

    sub call_stored_proc { 
     say sprintf "[%s] %s: %s", time, "call_stored_proc", "enter"; 
     sleep($slow ? 8 : 2); 
     say sprintf "[%s] %s: %s", time, "call_stored_proc", "leave"; 
     $done = 1 if !$slow; 
     --$slow; 
    } 

    $SIG{ALRM} = sub { 
     say sprintf "[%s] %s: %s", time, "SIGALRM hander", "enter"; 
     say sprintf "[%s] %s: %s", time, "SIGALRM hander", "alarm set for ".(time+5); 
     alarm(5); 
     call_stored_proc(); 
     say sprintf "[%s] %s: %s", time, "SIGALRM hander", "leave"; 
    }; 

    say sprintf "[%s] %s: %s", time, "[root]", "alarm set for ".(time+5); 
    alarm(5); 
    sleep(1) while !$done; 
' 

출력 : 당신이 볼 수 있듯이

[1474490009] [root]: alarm set for 1474490014 
[1474490014] SIGALRM hander: enter 
[1474490014] SIGALRM hander: alarm set for 1474490019 
[1474490014] call_stored_proc: enter 
[1474490022] call_stored_proc: leave 
[1474490022] SIGALRM hander: leave 
[1474490022] SIGALRM hander: enter 
[1474490022] SIGALRM hander: alarm set for 1474490027 
[1474490022] call_stored_proc: enter 
[1474490030] call_stored_proc: leave 
[1474490030] SIGALRM hander: leave 
[1474490031] SIGALRM hander: enter 
[1474490031] SIGALRM hander: alarm set for 1474490036 
[1474490031] call_stored_proc: enter 
[1474490033] call_stored_proc: leave 
[1474490033] SIGALRM hander: leave 

, call_stored_proc이 중단되지 않습니다. SIGALRM 핸들러가 리턴 될 때까지 SIGALRM이 표시되지 않습니다.

+0

다른 결과를 원하면 SIGALRM의 마스크를 해제 할 수 있습니다. – ikegami

+0

감사합니다. ikegami, 멋진 시뮬레이션! – Shashi