Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


5.3.4  Vaciado de buffers en C++

§1 Sinopsis

En la terminología C/C++, los flujos que son almacenados en una memoria caché ( H5.2) se denominan "buffered". Los compiladores C/C++ disponen de su propio sistema de caché para ficheros (de disco o de otro tipo). Esta caché se denomina de ejecución (runtime), para distinguirla de la caché del Sistema. Así mismo, disponen de recursos en la Librería Estándar para forzar su vaciado en caso necesario. Para esto se recurre a la funciones fflush (para ficheros abiertos con fopen) y flush (para los flujos de salida, "ostreams").

Sin embargo, no olvide que el vaciado de la caché del compilador se realiza sobre la del Sistema, que está por debajo (recuerde que el Software tiene una estructura de capas E1.7a), y que el SO decide por su cuenta cuando es el momento oportuno para realizar físicamente la escritura de los discos. Esto significa que una seguridad total solo se alcanza forzando la escritura de la caché del Sistema, y esto naturalmente depende de la plataforma utilizada.

Nota: además de las posibilidades ofrecidas en la Librería Estándar, el compilador MS Visual C++ para Windows ofrece la función _flushall, que fuerza el vaciado de la caché de ejecución de todos los ficheros abiertos. También dispone de la librería COMMODE.OBJ, que enlazada con la aplicación, fuerza que las llamadas a fflush y a _flushall escriban directamente los buffers al disco en vez de a la caché del Sistema.

§2  Ejemplo

El siguiente ejemplo muestra algunas formas de vaciado de los buffers del compilador y de la caché del Sistema

#include <stdio.h>

#include <ofstream.h>

 

void funcES1() {

  FILE* Fichero1;               // L.5
  ...   // abrir fichero y algún proceso

  fflush(Fichero1);             // L.6

  _commit(_filenum(Fichero1));  // L.7

}

 

void funcES2() {

  ofstream Fichero2;                // L.11
  Fichero2.open("somefile.txt");
  ...     // algún proceso

  Fichero2.flush();                 // L.12

  _commit(Fichero2.rdbuf()->fd());  // L:13

}

 

void main() {                   // ========

  funcES1();

  funcES2();

}

Comentario

L.5 abre el fichero Fichero1 para lectura y escritura.

La llamada a fflush en L.6 fuerza al programa a vaciar al SO la caché de ejecución asociados al fichero1.

La llamada a _commit en L.7 obliga al cache de disco del Sistema vaciar sus buffers.

L.11 se instancia un objeto Fichero2 de la plantilla basic_ofstream<char>, para realizar escritura.

La línea L.12 invoca el método flush para dicho objeto. Esta invocación fuerza al programa a vaciar al SO los buffers de ejecución asociados con Fichero2.

La invocación a _commit en L.13 obliga al caché de disco del Sistema a vaciar los buffers al disco. Esta función requiere un manejador "handle" referido al fichero; en este caso, el manejador se obtiene mediante una invocación al método rdbufofstream.rdbuf()->fd().

Nota_commit es una función de MS Visual C++ que obliga al Sistema a vaciar los buffers de un fichero determinado. No es estándar C++ y solo funciona en Sistemas MS de 16 bits. En los de 32 bits se recurre a la librería COMMOODE.OBJ según se ha indicado .

  Inicio.


[1]  Aunque de origen inglés, la palabra cache ha tomado carta de naturaleza en Español (la españolizamos añadiéndole un acento). Utilizada en informática significa memoria temporal. Generalmente de existencia oculta y automática para el usuario, que proporciona acceso rápido a los datos de uso más frecuente o previsible.