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: $!";
Итак, что я делаю не так с этим? Как будет выглядеть пример трубы? Есть ли лучший способ координировать вывод из нескольких процессов вместе на консоль?