fork () und STDOUT / STDERR von untergeordneten Prozessen an die Konsole senden

Ich schreibe ein Programm, das mehrere untergeordnete Prozesse abfragt, und möchte, dass all diese untergeordneten Prozesse Zeilen in @ schreiben könneSTDERR undSTDOUT ohne dass die Ausgabe verstümmelt wird. Ich mache nichts Besonderes, ich stelle nur Zeilen aus, die mit einer neuen Zeile enden (zumindest nach meinem Verständnis wäre das eine atomare Operation für Linux). Von Perlfaq heißt es:

Sowohl der Hauptprozess als auch der Hintergrundprozess (der "untergeordnete" Prozess) verwenden dieselben STDIN-, STDOUT- und STDERR-Dateihandles. Wenn beide gleichzeitig versuchen, auf sie zuzugreifen, können seltsame Dinge passieren. Möglicherweise möchten Sie diese für das Kind schließen oder erneut öffnen. Sie können dies umgehen, indem Sie eine Pipe öffnen (siehe open). Auf einigen Systemen bedeutet dies jedoch, dass der untergeordnete Prozess den übergeordneten nicht überleben kann.

s heißt, ich solle diese Dateihandles für das Kind schließen oder wieder öffnen. Das Schließen ist einfach, aber was bedeutet "erneut öffnen"? Ich habe so etwas in meinen untergeordneten Prozessen versucht und es funktioniert nicht (die Ausgabe wird immer noch verstümmelt):

open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!";
close(STDERR);

# re-open STDERR
open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!";

Also, was mache ich falsch damit? Wie würde das Pfeifenbeispiel aussehen? Gibt es eine bessere Möglichkeit, die Ausgabe mehrerer Prozesse an die Konsole zu koordinieren?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage