Bloqueo después de escribir en Linux

¿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?

preguntado el 22 de mayo de 12 a las 11:05

Posibles duplicar. -

@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 usando write(). -

@ 111111 Y RAII no le compra nada en caso de que su proceso falle (y menos aún si el sistema falla, por supuesto). -

@JamesKanze, por eso dije 'dependiendo de lo que quieras decir con accidente'. -

Siento que mi pregunta ya fue respondida en stackoverflow.com/questions/5132343/… -

1 Respuestas

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 or haz tu propia pregunta.