2012-05-17 4 views
3

나는 다음 코드를 작성하여 자식과 부모 간의 시그널링을 테스트했다. 이상적으로, 자식이 부모에게 SIGINT를 주면 부모는 새로운 반복으로 돌아와 사용자 입력을 기다려야합니다. 이것은 perl 5.8에서 관찰되었지만 perl 5.6.1에서는 부모가 실제로 "kill"되었습니다. 다음 반복은 없습니다.perl - 자식 프로세스 시그널링 부모

my $parent_pid = $$; 
$pid = fork(); 
if($pid == 0) 
{ 
    print "child started\n"; 
    kill 2, $parent_pid; 
} 
else 
{ 
    while(1) 
    { 
     eval 
     { 
      $SIG{INT} = sub{die "GOTCHA";}; 
      print 'inside parent'."\n"; 
      $a = <>; 
     }; 
     if([email protected]) 
     { 
       print "got the signal!!!!\[email protected]\n"; 
       next; 
     } 
    } 

} 

사람이 문제하거나 새로운 반복을 입력하도록 부모를 신호하는 다른 방법에 대한 둘러보기를 전해 주 시겠어요.

+0

SRY, 그것을 재현 할 수 없습니다. – int2000

+0

Windows인가요? – ikegami

+0

@ikegami windows 그것은 –

답변

3

5.6.X의 오류는 Perl이 신호 처리에 사용하는 방식 때문일 수 있으며, 이는 'Safe Signal Handling' in Perl 5.8.0으로 수정되었습니다. 두 경우 모두 사실적으로 고고학적인 Perl을 사용하고 있으며 적어도 Perl 5.12 이상, 이상적으로는 5.14 이상을 사용해야한다는 것을 강하게 주장해야합니다.

+0

어쩌면 당신은 맞습니다 ... 그러나 많은 의존성이 있습니다. –

2

부모가 준비되기 전에 자식이 SIGINT을 전송하여 발생하는 경쟁 조건이 될 수 있습니다. fork() 후에는 두 개의 독립적 인 프로세스가 있으며 각 프로세스는 원하는대로 진행될 수 있습니다.

fork() 전화를 받기 전에 SIGINT 처리기를 설정하는 것이 가장 좋으므로 자녀가 kill() 부모에게 연결을 시도하기 전에 분명히 알 수 있습니다. (약간의 수정과)

:

$SIG{INT} = sub { die "GOTCHA" }; 

my $parent_pid = $$; 
defined(my $pid = fork()) or die "Cannot fork() - $!"; 

if($pid == 0) 
{ 
    print "child started\n"; 
    kill INT => $parent_pid; 
} 
else 
{ 
    while(1) 
    { 
     eval 
     { 
      print "inside parent\n"; 
      <>; 
     }; 
     if([email protected]) 
     { 
      print "got the signal!!!!\[email protected]\n"; 
      next; 
     } 
    } 
} 
+0

다른 것들을 시도하면서, 나는 'sleep'을 적절하게 사용함으로써 경쟁 조건이 없다는 것을 확신했다. 어쨌든, 그것은 그 이유 일 수 있습니다. –