Moin,
* Joerg Rossdeutscher
Soweit die Theorie. In der Praxis funktioniert das prima, bis tatsächlich ein Fehler im Child-Block auftritt. Derzeit simuliere ich das einfach über ein "die" mit 30%-Chance. Es scheint, als würde ein "die" im Child auch den Parent sofort beenden. Verstehe ich nicht. Steht in der Doku anders.
- - - Schnipp - - - yooden@eumel % ./ratti.pl ~/tmp e 141 yooden@eumel % let a=141-128 && echo $a ~/tmp 13 yooden@eumel % man 7 signal | grep 13 ~/tmp SIGPIPE 13 A Broken pipe: write to pipe with no readers - - - Schnapp - - - - Das "e" in der zweiten Zeile verstehe ich nicht, vermutlich ebenfalls ein Problem mit der Spülung. Ich empfehle use English; $EXTREME_AUTOFLUSHING = 1; oder so ähnlich, ich weiß gerade nicht, wie die Variable heißt. - Die 141 in Zeile 3 ist $? des Vorprozesses (erscheint nur wenn != 0), also Dein Problem. (Zsh ruled übrigens.) Eine Lösung kann sein, eben doch ein Signal auszuwerten, aber SIGCHLD oder SIGPIPE. Dann unterläßt Du entweder das Schreiben in die Pipe, wenn das Kind im Jenseits ist oder nimmst nach dem Schreiben zur Kenntnis, daß das Kind tot ist und machst entsprechend weiter. Sauberer ist wohl ersteres. In C gibt es außerdem noch die Funktionen wait() und waitpid() um das etwas gepflegter auch mit mehreren Kindern abzuwickeln, vielleicht gibt's die auch in Perl.
Geguckt habe ich bisher in der perldoc unter perlipc und perlfork, große Teile des Scriptes sind den Beispielen dort entnommen.
Das Perl Cookbook kennst Du?
my ($pid,$line); my ($kid,$parent);
Ganz schön viele globale Variablen. Das würde mich gerade bei einem solchen Problem nervös machen. Thorsten -- The true danger is when liberty is nibbled away for expedients. - Edmund Burke