Solía ser el caso, y probablemente sigue siendo el caso, que cuando la salida estándar se escribe en un terminal, se almacena la línea de forma predeterminada, cuando se escribe una nueva línea, la línea se escribe en el terminal. Cuando la salida estándar se envía a una tubería, está completamente protegida, por lo que los datos solo se envían al siguiente proceso en la tubería cuando se llena la memoria intermedia de E / S estándar.
Esa es la fuente del problema. No estoy seguro de si hay mucho que pueda hacer para solucionarlo sin modificar el programa que se escribe en la tubería. Puede usar la setvbuf()
función con la _IOLBF
bandera para poner incondicionalmente stdout
en modo de línea de búfer. Pero no veo una manera fácil de aplicar eso en un programa. O el programa puede hacerlo fflush()
en los puntos apropiados (después de cada línea de salida), pero se aplica el mismo comentario.
Supongo que si reemplaza la tubería con un pseudo-terminal, la biblioteca de E / S estándar pensaría que la salida es un terminal (porque es un tipo de terminal) y alinearía el búfer automáticamente. Sin embargo, esa es una forma compleja de lidiar con las cosas.