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)
From [EMAIL PROTECTED]  Fri Aug 25 10:38:46 2006
From: [EMAIL PROTECTED] (Guillermo Parada)
Date: Fri Aug 25 10:36:55 2006
Subject: Copar datos a disco de una aplicacion c.
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

Me equivoque en escribir, quise poner sync, que puede lanzarse desde la
linea de comando, pero no hacia que la info de la aplicacion C se escribiera
físicamente en los disco.  Después de leer la explicacion de Alvaro y viendo
man de sync comienzo a entender porque rsync no era la solución a mi
problema, esto es porque los datos que quería asegurar pasaran al disco aun
no estaban ni siquiera en buffers del sistema de archivos.

En el código, agregaré después de fflush un fsync y veré la diferencia entre
fsync y sync.

Saludos,

Guillermo Parada.




On 8/25/06, Marcelo Espinosa Alliende <[EMAIL PROTECTED]> wrote:
>
>
> No es rsync... es "sync"!  :)
>
> SYNC(1)
>
> NAME
>        sync - flush file system buffers
> ....
>
>
> El jue, 24-08-2006 a las 22:35 -0400, 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);
> >
> > 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?.
> >
> > Guillermo Parada M.
> >
> >
> >
> > On 8/23/06, Alvaro Herrera <[EMAIL PROTECTED]> wrote:
> >         Guillermo Parada escribió:
> >         > Hola:
> >         >
> >         > Alguien me puede indicar como lograr que una aplicacion
> >         escrita en C escriba
> >         > parcialmente los resultados a un archivo de salida, sin
> >         cerrar este. Si
> >         > detengo la aplicacion con control-c, pierdo todo lo que esta
> >         habia hecho.
> >
> >         fflush?
> >
> >         --
> >         Alvaro Herrera                           Developer,
> >         http://www.PostgreSQL.org
> >         Oh, oh, las chicas galacianas, lo harán por las perlas,
> >         ¡Y las de Arrakis por el agua! Pero si buscas damas
> >         Que se consuman como llamas, ¡Prueba una hija de Caladan!
> >         (Gurney Halleck)
> >
> --
> Marcelo Espinosa Alliende,  mailto:[EMAIL PROTECTED]
> Jefe Depto de Servicios Computacionales
> Dirección de Informática
> Universidad del Bío-Bio
> fono: +56 41 2731531,  http://marcelo.ubb.cl
>
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: 
http://listas.inf.utfsm.cl/pipermail/linux/attachments/20060825/d767b6d2/attachment.html
From [EMAIL PROTECTED]  Fri Aug 25 11:44:27 2006
From: [EMAIL PROTECTED] (Alvaro Herrera)
Date: Fri Aug 25 11:36:24 2006
Subject: Copar datos a disco de una aplicacion c.
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

Guillermo Parada escribió:
> Me equivoque en escribir, quise poner sync, que puede lanzarse desde la
> linea de comando, pero no hacia que la info de la aplicacion C se escribiera
> físicamente en los disco.  Después de leer la explicacion de Alvaro y viendo
> man de sync comienzo a entender porque rsync no era la solución a mi
> problema, esto es porque los datos que quería asegurar pasaran al disco aun
> no estaban ni siquiera en buffers del sistema de archivos.
> 
> En el código, agregaré después de fflush un fsync y veré la diferencia entre
> fsync y sync.

sync(2) escribe _todos_ los cambios en todos los archivos.  fsync(2)
escribe los cambios en el archivo que le indicas.  Observa que sync(2)
retorna antes que este listo, mientras que fsync(2) se bloquea hasta que
ha completado su tarea.

-- 
Alvaro Herrera                 http://www.amazon.com/gp/registry/CTMLCN8V17R4
Criptografía: Poderosa técnica algorítmica de codificación que es
empleada en la creación de manuales de computadores.
From [EMAIL PROTECTED]  Fri Aug 25 12:25:00 2006
From: [EMAIL PROTECTED] (=?ISO-8859-1?Q?Germ=E1n_Po=F3_Caama=F1o?=)
Date: Fri Aug 25 13:14:46 2006
Subject: Copar datos a disco de una aplicacion c.
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

On Fri, 2006-08-25 at 10:38 -0400, Guillermo Parada wrote:
> Me equivoque en escribir, quise poner sync, que puede lanzarse desde
> la linea de comando, pero no hacia que la info de la aplicacion C se
> escribiera físicamente en los disco.  Después de leer la explicacion
> de Alvaro y viendo man de sync comienzo a entender porque rsync no era
> la solución a mi problema, esto es porque los datos que quería
> asegurar pasaran al disco aun no estaban ni siquiera en buffers del
> sistema de archivos. 

Estas seguro que viste la página correcta del manual?  Me late que viste
sync(1) y no sync(2).

$ man 2 sync

-- 
Germán Poó-Caamaño
http://www.ubiobio.cl/~gpoo/
Concepción - Chile

Responder a