fork () и STDOUT / STDERR на консоль от дочерних процессов

Я пишу программу, которая разветвляет несколько дочерних процессов, и я хотел бы, чтобы все эти дочерние процессы могли писать строки дляSTDERR а такжеSTDOUT без искаженного вывода. Я не делаю ничего особенного, просто выдаю строки, заканчивающиеся новой строкой (что, по крайней мере, в моем понимании, было бы атомарной операцией для Linux). От Perlfaq это говорит:

И основной процесс, и фоновый процесс («дочерний» процесс) используют одни и те же файловые дескрипторы STDIN, STDOUT и STDERR. Если оба пытаются получить к ним доступ сразу, могут произойти странные вещи. Вы можете закрыть или снова открыть их для ребенка. Вы можете обойти это, открыв канал (см. Open), но в некоторых системах это означает, что дочерний процесс не может пережить родительский процесс.

Там написано, что я должен «закрыть или открыть» эти файловые дескрипторы для ребенка. Закрытие просто, но что значит «открыть»? Я пробовал что-то подобное в моих дочерних процессах, и это не работает (вывод по-прежнему искажается):

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: $!";

Итак, что я делаю не так с этим? Как будет выглядеть пример трубы? Есть ли лучший способ координировать вывод из нескольких процессов вместе на консоль?

Ответы на вопрос(2)

Ваш ответ на вопрос