Tenemos un archivo que contiene datos que siempre deben ser consistentes. Cuando es necesario modificarlo, Process 1
crea un archivo nuevo, escribe el archivo nuevo con las modificaciones y utiliza mv
para cambiar el nombre del archivo nuevo al nombre de archivo anterior.
Si tenemos otro proceso Process 2
que necesita leer este archivo, ¿cómo podemos garantizar que siempre leerá un archivo consistente, es decir, un mv
by Process 1
durante 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 9pfs
que 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".