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