¿Cómo se comportan los archivos abiertos en los sistemas Linux?

17

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?

ripper234
fuente
No estoy poniendo esto como respuesta porque realmente no lo sé, pero creo que tiene que ver con que los inodos no se cambian cuando mueves un archivo.
mathepic

Respuestas:

20

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:

  1. Mover un archivo usando mvno cambia ese número subordinado a menos que lo mueve entre sistemas de ficheros (que es equivalente a usar cpa continuación, rmen el original).
  2. Debido a que más de un nombre puede conectarse a un solo archivo (es decir, tenemos enlaces duros), los datos en los archivos "eliminados" no desaparecen hasta que desaparecen todas las referencias al archivo subyacente.
  3. Quizás lo más importante: cuando un programa openes 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:

  • Un programa puede openleer un archivo, pero en realidad no lo lee hasta después de que el usuario lo haya rmeditado en la línea de comando, y el programa aún tendrá acceso a los datos .
  • El que encontró: el mvarchivo 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).
  • Si un programa ha openeditado un archivo para escribir, y el usuario rmes 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á
  • Dos programas que se comunican a través de uno o más archivos pueden obtener una seguridad cruda y parcial al eliminar los archivos una vez que hayan terminado open. (Esto no es una mente de seguridad real , solo transforma un agujero en una condición de carrera).
dmckee
fuente
1
Estoy de acuerdo con @dmckee, solo quería señalar: un programa puede openun archivo para leer y escribir (como lo que sucedió con el archivo de registro en la pregunta).
jsbillings
@jsbillings: Sí, pero existe un riesgo. Si todos los nombres del sistema de archivos se han ido, puede escribir GB en un archivo abierto que se evaporará como el rocío de la mañana tan pronto como lo cierre.
dmckee
1
Además, el inodo se copia en el núcleo y eso es lo que se opera, no la copia del disco. Entonces, el archivo podría ser mv'd o cp ', pero un archivo abierto ya está funcionando con las estructuras de datos del núcleo, no con la versión del disco. Entonces, si copia otro archivo en el archivo que está abierto para escritura, el proceso seguirá escribiendo en la misma posición relativa que en el archivo anterior. Esta es la razón por la cual los programas, como Apache httpd, tienen un controlador de señal que cierra y vuelve a abrir los archivos de registro.
Arcege
0

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é.

Sr. Shickadance
fuente
44
"Buscar alrededor: probablemente no encontrará una buena respuesta, pero la entenderá" no es una buena respuesta.
mattdm