한 가지 방법을 무엇을해야하는지 모른다는 자식 프로세스에서 실행하고 kill
부모의 시그널 핸들러에서 아이 SIGINT
하는 것입니다 부모가 수신합니다. 부모는 신호가 처리 된 이후에도 운전을 계속합니다.
use warnings;
use strict;
use feature 'say';
$SIG{INT} = \&sigint_handler; # or: $SIG{INT} = sub { ... };
say "Parent $$ start.";
my $pid = run_proc();
my $gone_pid = waitpid $pid, 0; # check status, in $?
say "Parent exiting";
sub run_proc
{
my $pid = fork // die "Can't fork: $!";
if ($pid == 0) { # child process
say "\tKid, sleep 5 (time for Ctrl-C)"; # run your job here
sleep 5;
say "\tKid exiting.";
exit;
}
return $pid;
}
sub sigint_handler {
if ($pid and kill 0, $pid) {
say "Got $_[0], send 'kill TERM' to child process $pid.";
my $no_signalled = kill 15, $pid;
}
else { die "Got $_[0]" } # or use exit
}
진단 인쇄용 코드가 많이 있습니다. 일부 의견은 kill
는 신호를 보냅니다
따릅니다. 어떤 방법으로도 프로세스가 종료되지는 않습니다. 이것을 kill $pid, 0
으로 확인하십시오. 프로세스가 을 수확하지 않은 경우 참을 반환합니다. (좀비 인 경우에도). 내 시스템에서 TERM
은 15
이고 매우 일반적인 경우에도 확인하십시오. 아이가 실행되지 않을 때
신호는 한 번에 올 수 있습니다. 처리기는 먼저 $pid
이 있는지 여부를 확인하고 그렇지 않은 경우 SIGINT
을 존중합니다. 적절하게 변경하십시오.
fork
뒤에 부모는 if ($pid == 0)
을 초과하고 바로 $pid
을 반환합니다.
을 어린이에 설치할 수 있습니다. 어린이가 주문할 수없는 경우 정리할 수 있습니다.
SIGINT
핸들러뿐만 아니라 아이의 부족하게됩니다
, 그래서 "Got $_[0] ..."
두 번 인쇄됩니다. 이것이 문제라면 신호를 무시하도록 자식에게 핸들을 추가하십시오 ($SIG{INT} = 'IGNORE';
). 아이가 실행되는 동안 Ctrl-C를 칠 장소와이로는 $?
를 통해 확인할 수 있습니다 종료되면 출력은 system
및 in perlvar를 참조 아이의 상태
Parent 9334 start.
Kid, sleep 5 (time for Ctrl-C)
^CGot INT, send 'kill TERM' to child process 9335.
Parent exiting
입니다.
문서 : fork (그리고 exec, system), %SIG in perlvar, waitpid, perlipc, kill의 일부.
부모와 통신하는 데 필요한 아동에 수행 된 작업이 다음 할 것이 더있을 것입니다 경우
. 그러나 질문에 추가 된 코드 스 니펫은 그렇지 않다는 것을 나타냅니다.
하는'실행이()' "_will LWP을합니까 어떻게 의뢰_"? 새 프로세스를 생성하거나 LWP를 실행하고 하위가 반환 될 때까지 대기합니까? – zdim
@zdim 두 번째 것 – daisy
'run'을위한 코드를 보여주세요. 그렇지 않으면 우리는 추측 할 것을 강요 당하고 잘못 받아 들일 것입니다. – Borodin