Perl: как отключиться от дочернего процесса после fork ?
От: Olksy Украина  
Дата: 16.03.12 20:58
Оценка:
Уже две недели пытаюсь найти решение, гугль не особо помогает. Может здесь кто-то подскажет?

После fork() родительский процесс какое-то время ждет пока от дочернего придет сообщение через пайп вида "BYE!\n" и завершается. Порожденный процесс после этого живет своей жизнью.

Вот то, что пока удалось создать:
http://paste.org.ru/?cbrrgo

Проблема в том, что родительский процесс не хочет завершаться, пока дочерний не закончит работать в фоне.

Как это сделать правильно?

Ни POSIX::setsid в потомке, ни setpgrp в родителе не помагают.
perl perlipc daemon
Re: Perl: как отключиться от дочернего процесса после fork ?
От: Olksy Украина  
Дата: 16.03.12 21:51
Оценка:
Сори, теперь всё работает
http://paste.org.ru/?2tecgk
Re[2]: Perl: как отключиться от дочернего процесса после for
От: dilmah США  
Дата: 16.03.12 22:54
Оценка:
дифф, если кому лень и интересно:

--- /tmp/perlfork2      2012-03-16 15:49:25.881571300 -0700
+++ /tmp/perlfork1      2012-03-16 15:47:58.201038700 -0700
@@ -9,7 +9,8 @@
 pipe(PARENT_RDR, CHILD_WTR);
 CHILD_WTR->autoflush(1);

-if (my $pid = fork()) {
+defined(my $pid = fork()) or die;
+if ($pid == 0) {

   # we are the child
   print CHILD_WTR "BYE!\n";
@@ -23,9 +24,8 @@
   exit;


-} else {
+} elsif ($pid) {

-  die unless defined $pid;
   # we are the child parent
   my $child_says = <PARENT_RDR>;
   print "parent: child said: $child_says";
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.