Я думаю, что ваше понимание задействованных слоев немного ошибочно.
Среда выполнения C printf
использует FILE *stdout
, что (если вы не используете freopen
или аналогичный) фактически эквивалентно fdopen(1, "w")
: то есть буферизованный вывод в дескрипторе файла # 1.
Обычно, когда вы запускаете my_program
, файловый дескриптор # 1 присоединяется к терминалу. Когда вы запускаете my_program > file
, файловый дескриптор # 1 присоединяется к file
до того, как ваша программа даже запустится. Таким образом, printf
, записывающий в stdout
, который (если вы не измените его) записывает в файловый дескриптор # 1, будет печатать в файл, а не на терминал.
Ничто за пределами вашей программы не заботит ваш буферизованный ввод-вывод или то, что вы делаете со своим собственным stdout
.