¿Cuál es la mejor manera de leer un archivo que se está modificando mediante copia en escritura?

¿Cuál es la mejor manera de leer un archivo que se está modificando mediante copia en escritura?

Tenemos un archivo que contiene datos que siempre deben ser consistentes. Cuando es necesario modificarlo, Process 1crea un archivo nuevo, escribe el archivo nuevo con las modificaciones y utiliza mvpara cambiar el nombre del archivo nuevo al nombre de archivo anterior.

Si tenemos otro proceso Process 2que necesita leer este archivo, ¿cómo podemos garantizar que siempre leerá un archivo consistente, es decir, un mvby Process 1durante la lectura no puede causar datos corruptos?

Respuesta1

Lo garantiza creando el nuevo archivo en el mismo sistema de archivos que el archivo anterior y utilizando la rename(2)función [1] que se garantiza que será atómica.

En los sistemas de archivos Unix, a rename(2)solo actúa sobre las entradas del directorio, no afectará a ningún proceso que tenga un identificador abierto para el inodo señalado por la entrada del directorio original; ese proceso continuará leyendo o escribiendo en el archivo antiguo.

Por lo general, la mv(1)utilidad simplemente invocará rename(2), pero puede recurrir a eliminar + copiar u otras operaciones no atómicas dudosas en el caso de que rename(2)falle.

Tenga en cuenta que el hecho de que dos archivos estén en el mismo sistema de archivos puede no garantizar que uno rename(2)tenga éxito; hay sistemas de archivos 9pfsque no admiten una operación de cambio de nombre, por lo que debe fabricarse, de una forma u otra.

[1] o incluso mejor, renameat(2)que evita que las rutas principales a los archivos sean modificadas subrepticiamente desde otro proceso, es decir, "ataques de enlace simbólico".

información relacionada