Опять про буферизацию в простом С, но с новой стороны. Понятно, что потоковый вывод (printf) буферизируется. Понятно про setbuf. Но почему он не буферезируется если программа выводит на терминал и буферезируется если выводиться, например, в файл или pipe?
Сейчас объясню проблему. Есть программа, она работает себе и печатает потихоньку всякую диагностику через printf. На терминал всё выводиться, всё устраивает. Может вывод и буферезируется построчно, но это не заметно и вполне приемлемо.
Совсем другая ситуация если поток направляется в файл или pipe. Тут наблюдается буферизация блоками (выяснился и размер блока - 256 байт).
Почему мне это не нравиться. Чтобы удалённо мониторить, что происходит с программой её вывод направляется на ввод другой программулки которая позволят всем заинтересованным лицам эту диагностику просматривать. И тут получаются нехилые задержки, что напрягает. В исходную программу вмешиваться нельзя. поэтому setbuf не придлагать, но имеется возможность изменить способ её запуска, в частности в родительском процессе (который запускает основную программу) поднастроить дескрипторы 0, 1, 2.
Поэтому вопрос. По какому принципу printf изменяет своё поведение в плане буферизации в зависимости от того куда выводит в pipe или терминал? То есть printf проверяет, что дескриптор 1 - это дескриптор именно терминала, или при наследовании дескриптора 1 есть некие настройки дескриптора, указывающие printf поведение при буферизации? Я это к тому, что: могу ли я перед exec основной программы в родительском процессе изменить флаги/режимы дескриптора 1 (который будет указывать на pipe), чтобы printf в основной (дочерней) программе принял построчную буферизацию или работал без неё вообще?