2011-03-07 7 views
11

Si estoy leyendo un archivo almacenado en un sistema de archivos NTFS, y trato de mover/cambiar el nombre de ese archivo mientras todavía se está leyendo, no puedo hacerlo. Si pruebo esto en un sistema de archivos UNIX como EXT3, tiene éxito, y el proceso que realiza la lectura no se ve afectado. Incluso puedo confirmar el archivo y los procesos de lectura no se ven afectados. ¿Como funciona esto? ¿Podría alguien explicarme por qué este comportamiento es compatible con los sistemas de archivos UNIX pero no con NTFS? Tengo una vaga sensación de que tiene que ver con enlaces duros e inodos, pero agradecería una buena explicación.¿Cómo funcionan los comandos de UNIX mv y rm con archivos abiertos?

Respuesta

23

sistemas de archivos Unix utilizan el recuento de referencias y una arquitectura de dos capas para la búsqueda de archivos.

El nombre de archivo hace referencia a algo llamado inode, para nodo de información o nodo de índice. El inodo almacena (un puntero) el contenido del archivo así como algunos metadatos, como el tipo de archivo (ordinario, directorio, dispositivo, etc.) y quién lo posee.

Los nombres de varios archivos pueden referirse al mismo inodo; luego se llaman hard links. Además, un file descriptor (fd) se refiere a un inodo. Un fd es el tipo de objeto que obtiene un proceso cuando abre un archivo.

Un archivo en un sistema de archivos Unix solo desaparece cuando la última referencia se ha ido, por lo que cuando no hay más nombres (enlaces duros) o fd's haciendo referencia a él. Por lo tanto, rm en realidad no elimina un archivo; elimina una referencia a un archivo.

Esta configuración del sistema de archivos puede parecer confusa y a veces plantea problemas (especialmente con NFS), pero tiene el beneficio de que el bloqueo no es necesario para muchas aplicaciones. Muchos programas Unix también usan la situación en su beneficio abriendo un archivo temporal y eliminándolo inmediatamente después. Tan pronto como terminan, incluso si se bloquean, el archivo temporal se ha ido.

+0

¿Existen limitaciones en cuanto a dónde puedo mover un archivo abierto? P.ej. solo dentro del mismo sistema de archivos? –

+0

@ivan_pozdeev haciendo un 'mv' en un archivo a través de diferentes sistemas de archivos, en realidad copia los datos y borra el archivo original, en este caso es similar a una' rm' del archivo abierto. – dsonck92

4

En Unix, un nombre de archivo es simplemente un enlace al archivo real (inode). Abrir un archivo también crea un enlace (temporal) al archivo real. Cuando todos los enlaces a un archivo han desaparecido (rm y close()), entonces el archivo se elimina.

En NTFS, lógicamente el nombre de archivo es el archivo. No hay una capa indirecta desde el nombre del archivo al archivo metainfo, son el mismo objeto. Si lo abre, está en uso y no se puede eliminar, al igual que el archivo real (inode) en Unix no se puede eliminar mientras está en uso.

Unix: Nombre del archivo -> FileInfo -> Archivo de Datos

NTFS: Nombre de archivo/FileInfo -> Archivo de Datos

Cuestiones relacionadas