Posix define os fluxos padrão assim :
At program start-up, three streams shall be predefined and need not be opened explicitly: standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). When opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.
A Biblioteca GNU C descreve os fluxos padrão da mesma forma:
Portanto, as definições padrão têm pouca orientação para o uso do fluxo além da saída convencional / normal e da saída de diagnóstico / erro. Na prática, é comum redirecionar um ou ambos desses fluxos para arquivos e pipelines, onde os indicadores de progresso ser um problema. Alguns sistemas até mesmo monitoramVariable: FILE * stdout
The standard output stream, which is used for normal output from the program.Variable: FILE * stderr
The standard error stream, which is used for error messages and diagnostics issued by the program.
stderr
para saída e consideram um sinal de problemas. Informações de progresso puramente auxiliares são, portanto, problemáticas em qualquer fluxo.
Em vez de enviar indicadores de progresso incondicionalmente para qualquer fluxo padrão, é importante reconhecer que a saída de progresso é apropriada apenas para fluxos interativos . Com isso em mente, recomendo escrever contadores de progresso somente depois de verificar se o fluxo é interativo (por exemplo, com isatty()
) ou quando explicitamente habilitado por uma opção de linha de comando. Isso é especialmente importante para os medidores de progresso que dependem do comportamento da atualização de terminal para fazer sentido, como barras de% -completa.
Para determinadas mensagens de progresso muito simples ("Iniciando X" ... "Concluído com X"), é mais razoável incluir a saída mesmo para fluxos não interativos. Nesse caso, considere como os usuários podem interagir com os fluxos, como pesquisar com grep
ou paginar com less
ou monitorar com tail -f
. Se fizer sentido ver as mensagens de progresso nesses contextos, será muito mais fácil consumir de stdout
.