2012-05-17 3 views
3

Я написал следующий фрагмент кода для проверки сигнализации между дочерним и родительским. В идеале, когда дочерний элемент предоставляет родительский элемент SIGINT, родитель должен вернуться в новую итерацию и ждать ввода пользователя. Это я наблюдал в perl 5.8, но в perl 5.6.1 (который я просил использовать) родитель фактически «убит». Нет следующей итерации.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; 
     } 
    } 

} 

Может кто-то пожалуйста, дайте Walkaround для этой проблемы или каким-либо другим способом, чтобы сигнализировать родителю, так что он входит в новую итерацию.

+0

Sry, не может воспроизвести. – int2000

+0

Windows или нет? – ikegami

+0

Окна @ikegami - –

ответ

3

Ошибка на 5.6.X может быть из-за того, что Perl используется для обработки сигналов, которые были исправлены с помощью 'Safe Signal Handling' in Perl 5.8.0. В любом случае вы используете Perl, который практически археологический, и вы должны серьезно возразить своим хозяевам, что вы должны использовать хотя бы Perl 5.12 и идеально 5.14.

+0

Возможно, вы правы ... НО есть много зависимостей. –

2

Это может быть состояние гонки, вызванное тем, что ребенок отправил SIGINT, прежде чем родитель был готов к этому. Помните, что после вас fork() у вас будет два независимых процесса, каждый из которых может проходить в любом темпе, который ему нравится.

Это лучше в вашем случае, чтобы настроить SIGINT обработчик перед fork() вызова, так что вы знаете, что это, безусловно, на месте до того, как ребенок пытается 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

, пробовав разные вещи, я убедился, что не было никакого состояния гонки, соответствующим образом используя «спит». В любом случае, это вполне могло быть причиной. –

Смежные вопросы