Estoy aprendiendo C con el libro de Kernighan y Ritchie; Estoy en los conceptos básicos del cuarto capítulo (“Funciones y estructura del programa”). El otro día me entró curiosidad por el sleep()
función, así que traté de usarlo así:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf(" I like cows.");
sleep(5);
return 0;
}
El problema es la salida del programa, parece que hace lo sleep()
primero y luego el printf()
, en otras palabras, espera cinco segundos y luego imprime la cadena. Así que pensé, tal vez el programa llega a sleep()
tan rápido que no deja printf()
hacer su trabajo como quiero, es decir, imprimir la cadena y luego dormir.
¿Cómo puedo mostrar la cadena y luego poner el programa a dormir? El compilador es GCC 3.3.5 (propolice) en OpenBSD 4.3.

roberto apuesta
printf()
escribe a stdout
(el flujo de salida predeterminado) que generalmente tiene un búfer de línea. El búfer no se descarga en el momento sleep
se llama para que no se muestre nada, cuando el programa sale, todas las secuencias se vacían automáticamente, por lo que se imprime justo antes de salir. Imprimir una nueva línea generalmente hará que la secuencia se vacíe, alternativamente, puede usar el fflush
función:
int main(void)
{
printf(" I like cows.\n");
sleep(5);
return 0;
}
o:
int main(void)
{
printf(" I like cows.");
fflush(stdout);
sleep(5);
return 0;
}
Si está imprimiendo en una secuencia que no tiene un búfer de línea, como puede ser el caso si stdout
es redirigido o está escribiendo en un archivo, simplemente imprimir una nueva línea probablemente no funcione. En tales casos, debe utilizar fflush
si desea que los datos se escriban inmediatamente.

pablo tomblin
Su problema es que printf (y cualquier otra cosa que use la biblioteca stdio para escribir en stdout (salida estándar)) se almacena en el búfer: la línea se almacena en el búfer si va a la consola y el tamaño se almacena en el búfer si va a un archivo. si haces un fflush(stdout);
después de la printf
, hará lo que quieras. Puede intentar simplemente agregar una nueva línea (‘\ n’) a su cadena, y eso haría lo correcto siempre que no redirija la salida estándar a un archivo.
No estoy 100% seguro, pero creo stderr
no está almacenado en el búfer, lo que puede causar confusión porque es posible que vea el resultado que realizó en stderr
antes de la salida que hizo previamente a stdout
.

Vinko Vrsalovic
El almacenamiento en búfer significa que toda la salida se almacena en un lugar (llamado búfer) y se emite después de que una cierta cantidad de datos está presente en él. Esto se hace por razones de eficiencia.
Algunas implementaciones (¿la mayoría?) limpian el búfer después de una nueva línea al escribir en la consola, por lo que también puede intentar
printf(" I like cows.\n");
en lugar de la llamada a fflush()
Implementé el encuentro de tiempo de la siguiente manera;
for (int i = 1; i <= 60; i++) {
printf("%02d", i);
fflush(stdout);
sleep(1);
printf("\b\b");
}