Bloqueo después de escribir en Linux
Frecuentes
Visto 1,061 veces
6
¿Qué pasaría si tuviera que usar write() para escribir algunos datos en un archivo en el disco? Pero mi aplicación se bloqueó antes de descargar. ¿Está garantizado que mis datos eventualmente se descargarán en el disco si no hay una falla en el sistema?
1 Respuestas
5
Si estás usando write
(y no fwrite
or std::ostream::write
), entonces no hay almacenamiento en búfer en proceso. Si no hay falla del sistema, los datos, tarde o temprano (y generalmente bastante pronto) se escribirán en el disco.
Si realmente le preocupa la integridad de los datos, puede o en las banderas
O_DSYNC
y O_SYNC
a las banderas al abrir el archivo. Si hace esto, tiene la garantía de que los datos se escriben físicamente en el disco antes de la devolución de write
.
contestado el 22 de mayo de 12 a las 12:05
documentos de kernel.org diga esto: "Un retorno exitoso de write() no garantiza que los datos se hayan enviado al disco. De hecho, en algunas implementaciones con errores, ni siquiera garantiza que el espacio se haya reservado con éxito para los datos. La única manera para estar seguro es llamar a fsync(2) una vez que haya terminado de escribir todos sus datos". - David Heffernan
@DavidHeffernan: Si write
regresa, el núcleo tiene sus datos, si alguna vez llega al plato es una historia diferente. (además fsync
puede que no ayude ya que los discos tienen sus propios cachés). La clave aquí es commited to disk
que no se puede garantizar - Hasturkun
@DavidHeffernan Obviamente, si la implementación tiene errores, entonces no puede garantizar nada. un regreso de write()
garantiza que el sistema operativo tiene los datos y "terminará" de procesarlos independientemente de lo que suceda con su proceso. Si usas las banderas que menciono en open
, entonces de acuerdo con Posix, el sistema no debería regresar de write()
hasta que se garantice la integridad total de los datos. (En la práctica, esto puede no ser posible en algunos sistemas de archivos, particularmente en los montados remotamente). - james kanze
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas linux or haz tu propia pregunta.
Posibles duplicar. - Alex Bakulin
@111111 Si le preocupa la integridad transaccional, no puede usar
std::ofstream
, ya que no tiene ninguna opción que garantice la sincronización del disco. Por lo general, usarástd::ostringstream
para construir un registro (si el archivo está orientado a texto), y luego generarlo en una acción atómica usandowrite()
. - James Kanze@ 111111 Y RAII no le compra nada en caso de que su proceso falle (y menos aún si el sistema falla, por supuesto). - James Kanze
@JamesKanze, por eso dije 'dependiendo de lo que quieras decir con accidente'. - 111111
Siento que mi pregunta ya fue respondida en stackoverflow.com/questions/5132343/… - pjay