Когда каналы установлены и имеют перезаписанные stdout и stderr, куда идет printf? - PullRequest
1 голос
/ 19 марта 2009

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

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

Ответы [ 3 ]

3 голосов
/ 19 марта 2009

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

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

3 голосов
/ 19 марта 2009

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

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

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

Итак, вам не нужно делать ничего особенного - об этом позаботятся автоматически.

2 голосов
/ 19 марта 2009

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

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

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

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

...