Copar datos a disco de una aplicacion c.

Alvaro Herrera alvherre en alvh.no-ip.org
Vie Ago 25 09:48:35 CLT 2006


Guillermo Parada escribió:
> Alvaro:
> 
> fflush me sirvió, esto es obliga a que los archivos abiertos sean
> actualizados desde los buffer, un fragmento de código es:
> 
>                get_str_localtime(str_aux);
>                fprintf(fp_log_principal, "[%s] >>>>Corrida %d de
> %d<<<<<\n", str_aux,i+1 , total_corridas);
>                ...
>                fflush(fp_log_principal);

Justamente eso era lo que te estaba sugiriendo.

> Antes de implementar fflush, trataba de lograr lo mismo desde la linea de
> comando con rsync, pero no hacia el flush de los buffers. Segun entiendo la
> documentacion de el comando rsync dice que lo deberia hacer. Alguien sabe
> porque no tiene el mismo efecto que poner fflush en el código de la
> aplicacion?.

Hum, la verdad no veo que relacion pueda tener el comando rsync :-)

Por otro lado lee con atencion el manual de fflush: dice

	forces a write of all user-space buffered data for the given
	output or update stream via the stream's underlying write
	function.

Observa que la libc mantiene un buffer interno al cual van a parar las
escrituras, para mejorar rendimiento.  Solo cuando llamas fflush se pasa
este buffer a write(), que las transfiere hasta el kernel.

Si quieres asegurarte que el log se escribe fisicamente en el disco,
debes llamar a fflush() y luego fsync() (Si no lo haces, una caida
despues que invocas a fflush podria hacer que el archivo no fuera
escrito).

-- 
Alvaro Herrera                                http://www.PlanetPostgreSQL.org
"A wizard is never late, Frodo Baggins, nor is he early.
 He arrives precisely when he means to."  (Gandalf, en LoTR FoTR)


Más información sobre la lista de distribución Linux