Acabo de cambiar el nombre de un archivo de registro a "foo.log.old", y asumí que la aplicación comenzará a escribir un nuevo archivo de registro en "foo.log". Me sorprendió descubrir que rastreó el archivo de registro a su nuevo nombre y siguió agregando líneas a "foo.log.old".
En Windows, no estoy familiarizado con este tipo de comportamiento: no sé si es posible implementarlo. ¿Cómo se implementa exactamente este comportamiento en Linux? ¿Dónde puedo obtener más información al respecto?
files
open-files
rename
ripper234
fuente
fuente
Respuestas:
Los programas se conectan a los archivos a través de un número mantenido por el sistema de archivos (llamado inodo en los sistemas de archivos Unix tradicionales), al cual el nombre es solo una referencia (y posiblemente no una referencia única).
Hay varias cosas a tener en cuenta:
mv
no cambia ese número subordinado a menos que lo mueve entre sistemas de ficheros (que es equivalente a usarcp
a continuación,rm
en el original).open
es un archivo, hace una referencia a él que es (a los efectos de cuándo se eliminarán los datos) equivalente a tener un nombre de archivo conectado a él.Esto da lugar a varios comportamientos como:
open
leer un archivo, pero en realidad no lo lee hasta después de que el usuario lo hayarm
editado en la línea de comando, y el programa aún tendrá acceso a los datos .mv
archivo no desconecta la relación entre el archivo y los programas que lo tienen abierto (a menos que se mueva a través de los límites del sistema de archivos, en cuyo caso el programa todavía tiene una versión del original para trabajar).open
editado un archivo para escribir, y el usuariorm
es su último nombre de archivo en la línea de comando, el programa puede continuar agregando cosas al archivo, pero tan pronto como se cierre no habrá más referencias a esos datos y se iráopen
. (Esto no es una mente de seguridad real , solo transforma un agujero en una condición de carrera).fuente
open
un archivo para leer y escribir (como lo que sucedió con el archivo de registro en la pregunta).Para ver realmente cómo se implementa este comportamiento, puede consultar algunos libros de programación de Unix. Mathepic tiene razón en que está relacionado con un inodo. El nombre de ruta real solo se usa para abrir el archivo, una vez hecho esto, el programa lo referencia por su descriptor de archivo abierto. El descriptor de archivo a su vez hace referencia al inodo, que en este caso no le importa si el nombre de los archivos subyacentes ha cambiado.
En cuanto a implementar esto en Windows, esa es una pregunta para otro sitio.
Para leer más sobre esto sin tocar los libros, simplemente busque sistemas de archivos de Linux e inodes. Puede que no haya una respuesta clara, pero podrá comprender por qué.
fuente