Уже две недели пытаюсь найти решение, гугль не особо помогает. Может здесь кто-то подскажет?
После fork() родительский процесс какое-то время ждет пока от дочернего придет сообщение через пайп вида "BYE!\n" и завершается. Порожденный процесс после этого живет своей жизнью.
Вот то, что пока удалось создать:
http://paste.org.ru/?cbrrgo
Проблема в том, что родительский процесс не хочет завершаться, пока дочерний не закончит работать в фоне.
Как это сделать правильно?
Ни POSIX::setsid в потомке, ни setpgrp в родителе не помагают.
дифф, если кому лень и интересно:
--- /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";