Buffering stdin & stdout

Tengo esta simple paz de código:

#include  int main() { fprintf(stdout , "stdout \n"); fprintf(stderr , "stduerr \n"); return 0; } Output: stdout stderr 

Sé que stdout está almacenado en búfer y stderr no lo es, y conozco una descarga de nueva línea

El resultado en Windows y NetBeans es:

 stdout stderr 

el resultado utilizando mac y Eclipse:

 stderr stdout 

y quiero saber por qué …

Muchas gracias …

stdout por defecto (en su sistema de todos modos) tiene búfer de línea, lo que significa que se vaciará cuando lo vacíe, o cuando ponga un carácter de nueva línea ‘\ n’ en él, lo que hace aquí:

 fprintf(stdout , "stdout \n"); 

Más sobre el buffering de stdout:

Si se sabe que la salida estándar no se refiere a un dispositivo interactivo, el flujo está completamente almacenado en búfer. De lo contrario, depende de la biblioteca si el flujo está en línea con búfer o no en búfer de forma predeterminada (consulte setvbuf).

Fuente

Con stdio(3) las secuencias de salida que se refieren a dispositivos terminales tienen stdio(3) línea como stdout , mientras que stderr no está en búfer.

El progtwig anterior se cierra inmediatamente después de fprintf, por lo que stdout se vacía en ese momento.

Si desea ver las diferencias en el comportamiento, redirija stdout y stderr a un archivo, y agregue algunas líneas fprintf más.

Como otros ya han señalado, obtendrá el resultado que esperaba si usa

 fprintf(stdout, "STDOUT"); fprintf(stderr, "STDERR"); 

Esto se debe a que el terminal predeterminado de la terminal de Linux es el búfer de línea mientras que stderr no está en búfer.

Deberá vaciar la salida estándar o imprimir manualmente un ‘\ n’ a la salida estándar antes de la impresión a stderr. Luego lo verás antes del mensaje stderr.

Tenga en cuenta que también es posible desactivar el almacenamiento en búfer para stdout.