Buffers de limpieza en C

¿Debería fflush() no usarse para enjuagar un buffer incluso si es un flujo de salida?

Para que sirve? ¿Cómo lavamos un buffer en general?

Nunca escuché no descargar el buffer de salida, y me interesaría escuchar tu fuente al respecto. Vaciar los búferes de salida:

 printf("Buffered, will be flushed"); fflush(stdout); // Prints to screen or whatever your standard out is 

o

 fprintf(fd, "Buffered, will be flushed"); fflush(fd); //Prints to a file 

Puede ser una técnica muy útil. ¿Por qué querrías vaciar un buffer de salida? Por lo general, cuando lo hago, es porque el código se bloquea y estoy tratando de depurar algo. El búfer estándar no se imprimirá cada vez que llame a printf() , esperará hasta que esté lleno y luego arrojará un montón al mismo tiempo. Por lo tanto, si está intentando verificar si está realizando una llamada a función antes de un locking, es útil printf algo así como “¡llegó aquí!”, Y algunas veces el búfer no se ha limpiado antes de que ocurra el locking y puede Dime cuán lejos has llegado realmente.

Otra vez que es útil, es en código multiproceso o multiproceso. Una vez más, el búfer no siempre se descarga en una llamada a printf() , por lo que si desea conocer el verdadero orden de ejecución de múltiples procesos, debe enjuagar el búfer después de cada impresión.

Tengo el hábito de hacerlo, me ahorra muchos dolores de cabeza en la depuración. El único inconveniente que se me ocurre es que printf() es una operación costosa (por lo que no vacía el búfer por defecto).


En cuanto a enjuagar el buffer de entrada ( stdin ), no deberías hacer eso. Flushing stdin es un comportamiento indefinido de acuerdo con el estándar C11 §7.21.5.2 parte 2:

Si la ruta apunta a una secuencia de salida … la función fflush hace que los datos no escritos de esa secuencia … se escriban en el archivo; de lo contrario, el comportamiento no está definido.

En algunos sistemas, siendo Linux uno como se puede ver en la página man para fflush() , existe un comportamiento definido pero depende del sistema para que su código no sea portátil.

Ahora, si le preocupa que la basura esté “atascada” en el búfer de entrada, puede usar fpurge() sobre eso. Consulte aquí para obtener más información sobre fflush() y fpurge()