Hay una región en el archivo (posiblemente pequeña) que quiero sobrescribir. Supongamos que llamo fseek, fwrite, fsync. ¿Hay alguna forma de garantizar la atomicidad de dicha operación de reescritura regional, p. Necesito estar seguro de que, en cualquier caso de falla, la región solo contendrá datos antiguos (antes de la modificación), o solo datos nuevos (modificados), pero no una combinación de esto.Modificación de archivo atómico
Hay dos cosas que quiero resaltar.
Primera: Está bien si no hay manera de escribir atómicamente cualquier región del tamaño - podemos manejarlo anexando los datos en el fichero, fsync'ing, y luego volver a escribir zona 'puntero' en el archivo, a continuación, de nuevo fsyncing . Sin embargo, si la escritura 'puntero' no es atómica, aún podemos tener un archivo dañado con punteros ilegales.
Segundo: Estoy bastante seguro, escribir regiones de 1 byte es atómico: no veré en el archivo los bytes que nunca coloqué allí. Así que podemos usar algunos trucos para asignar dos regiones para las direcciones y usar el interruptor de 1 byte, así que volver a escribir la región se convirtió en: agregar datos nuevos, sincronizar, reescribir uno de dos espacios del puntero (sin usar), sincronizar nuevamente y luego reescribir 'cambiar byte 'y una vez más la sincronización. Entonces la operación de sobreescribir región ahora contiene al menos 3 invocación fsync.
Todo esto sería mucho más fácil, si tendré escritura atómica por largos, ¿pero realmente la tengo?
¿Hay alguna forma de manejar esta situación sin usar el método mencionado en el punto 2?
Otra pregunta es: ¿hay alguna garantía de pedido entre la escritura y la sincronización? Por ejemplo, si llamo a fseek, fwrite [1], fseek, fwrite [2], fsync, ¿puedo escribir en [2] commited, y escribir en [1] - no commited?
Esta pregunta es aplicable al sistema operativo Linux y Windows, cualquier respuesta en particular (por ejemplo, en la versión ubuntu a.b.c ....) también es necesaria.
[fsync] (http://linux.die.net/man/3/fsync) parece ser bastante aplicación/sistema de archivos dependientes. http://blogs.gnome.org/alexl/2009/03/16/ext4-vs-fsync-my-take/ – zapl
Lo que estás hablando se conoce como "control de compromiso", o "commit/rollback", o "transacciones". –
(La única forma (casi) totalmente confiable de hacer lo que usted desea, a falta de alguna función de procesamiento de transacciones en la caja, es hacer el viejo intercambio de archivos: copiar el archivo antiguo a nuevo, cambiar el nuevo, renombrar nuevo para reemplazar el anterior). –