2009-03-19 8 views
1

Я настроил трубы для перенаправления stderr и stdout. Когда я использую printf, он отправляет данные в stdout или в поток 1?Когда трубы на месте и перезаписаны stdout и stderr, куда идет printf?

Если он отправляет его на stdout, как я могу настроить его для отправки данных в поток 1?

ответ

3

printf всегда отправляет данные в стандартный вывод. Если вы перенаправили stdout с помощью канала, он перейдет к процессу, с которым stdout отправляется.

И поток 1 (предполагается, что вы имеете в виду поток, связанный с дескриптором файла 1) является стандартный вывод, если вы делаете что-то действительно странно (в этом случае, остановить)

3

Когда я использую printf, он отправляет данные в stdout или в поток 1?

Функция printf отправляет данные в stdout. Поскольку вы перенаправили stdout, теперь он указывает на файл, отличный от вашей консоли. printf все равно, что это такое, он просто пишет, сколько может.

Если он отправляет его на стандартный вывод, как я могу настроить его для передачи данных в поток 1?

Так что вам не нужно ничего особенного - это берется автоматически.

2

Я думаю, ваше понимание вовлеченные слои немного ошибочны.

: C среды выполнения printf использует FILE *stdout, который (если вы не используете freopen или аналогичный) эффективно эквивалентно fdopen(1, "w"): то есть, с буферным выводом на файле дескриптора # 1.

Обычно, когда вы запускаете my_program, дескриптор файла 1 прикрепляется к терминалу. Когда вы запускаете my_program > file, дескриптор файла 1 прикрепляется к fileдо, ваша программа даже начинает работать. Итак, printf, записывая в stdout, который (если вы не измените его), начертано в дескриптор файла №1, будет печататься в файл, а не в терминал.

Ничто вне вашей программы не заботится о вашем буферизованном вводе-выводе или о том, что вы делаете со своим собственным stdout.