당신은 당신이
$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이 표시되지 않습니다.
다른 결과를 원하면 SIGALRM의 마스크를 해제 할 수 있습니다. – ikegami
감사합니다. ikegami, 멋진 시뮬레이션! – Shashi