Que parte do sistema configura o buffer dos três fluxos padrão quando um programa é iniciado?
Isso é parte do linux, ou glibc, ou talvez bash? O POSIX define o comportamento ou faz parte de C?
Posix tem algumas respostas:
https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05
Na inicialização do programa, três fluxos são predefinidos e não precisam ser abertos explicitamente: entrada padrão (para leitura de entrada convencional), saída padrão (para gravação de saída convencional) e erro padrão (para gravação de saída de diagnóstico). Quando aberto, o fluxo de erro padrão não é totalmente armazenado em buffer; os fluxos de entrada padrão e de saída padrão são totalmente armazenados em buffer se e somente se o fluxo puder ser determinado para não se referir a um dispositivo interativo.
Portanto, se o sistema pode determinar que os fluxos NÃO são interativos, eles podem ser totalmente armazenados em buffer (exceto stderr), mas na prática, qual parte do sistema isso determina?
Sua linguagem de programação
Esse comportamento é um artefato da biblioteca de tempo de execução C e um requisito da linguagem de programação C. Historicamente, outras linguagens de programação foram construídas em cima da biblioteca de tempo de execução C e obtêm esse comportamento dela. Isso é verdade para programas C++, por exemplo. O capítulo e o verso dos padrões de linguagem C e C++ são citados com bastante frequência no Stack Overflow (qv).
Mais notavelmente, os programas escritos em Python têm o mesmo comportamento e são questionados com bastante frequência, às vezes com a culpa pelo comportamento do tempo de execução da linguagem de programação ser mal colocado.
As ferramentas para alterar esse comportamento de programas que usam a semântica da linguagem padrão (sem modificar e recompilar os programas) vêm em duas formas: ferramentas dependentes da linguagem (e às vezes específicas da biblioteca de tempo de execução) que se inserem no tempo de execução e alteram o buffer, e ferramentas que transformam E/S padrão em arquivos que as bibliotecas de tempo de execução decidem ser dispositivos interativos. As ferramentas da última classe são independentes de linguagem e incluem Bernstein
ptybandage
.Leitura adicional
Apenas algumas instâncias da questão do buffer: