¿Qué está haciendo Linux de manera diferente que me permite eliminar / reemplazar archivos donde Windows se quejaría de que el archivo está actualmente en uso?


30

El ejemplo que tengo es Minecraft. Cuando ejecuto Bukkit en Linux, puedo eliminar o actualizar los archivos .jar en la carpeta / plugins y simplemente ejecutar el comando 'reload'.

En Windows, tengo que eliminar todo el proceso del servidor porque se quejará de que el archivo .jar está actualmente en uso cuando intento eliminarlo o reemplazarlo.

Esto es asombroso para mí, pero ¿por qué sucede? ¿Qué está haciendo Linux de manera diferente aquí?

Respuestas:


35

Linux elimina un archivo de manera completamente diferente a como lo hace Windows. Primero, una breve explicación sobre cómo se gestionan los archivos en los sistemas de archivos nativos * unix.

El archivo se mantiene en el disco en la estructura multinivel llamada i-node. Cada nodo i tiene un número único en el sistema de archivos único. La estructura i-node mantiene información diferente sobre un archivo, como su tamaño, bloques de datos asignados para el archivo, etc., pero en aras de esta respuesta, el elemento de datos más importante es a link counter. El directoriesson los archivos que mantienen registros sobre los archivos. Cada registro tiene el número de i-nodo al que hace referencia, la longitud del nombre del archivo y el nombre del archivo en sí. Este esquema permite tener 'punteros', es decir, 'enlaces' al mismo archivo en diferentes lugares con diferentes nombres. El contador de enlaces del i-node en realidad mantiene el número de enlaces que se refieren a este i-node.

¿Qué sucede cuando algún proceso abre el archivo? Primero, la open()función busca el registro del archivo. Luego verifica si la estructura de i-nodo en memoria para este i-nodo ya existe. Esto puede suceder si alguna aplicación ya tenía este archivo abierto. De lo contrario, el sistema inicializa una nueva estructura de i-nodo en memoria. Luego, el sistema aumenta el contador abierto de la estructura i-node en memoria y devuelve a la aplicación su descriptor de archivo.

Se llama a la llamada a la biblioteca de Linux para eliminar un archivo unlink. Esta función elimina el registro del archivo de un directorio y disminuye el contador de enlaces del nodo i. Si el sistema descubrió que existe una estructura de i-nodo en memoria y su contador abierto no es cero, entonces esta llamada devuelve el control a la aplicación. De lo contrario, comprueba si el contador de enlaces se convirtió en cero y, si lo hace, el sistema libera todos los bloques asignados para el i-node y el i-node en sí y vuelve a la aplicación.

¿Qué sucede que una aplicación cierra un archivo? La función close()disminuye el contador abierto y verifica su valor. Si el valor no es cero, la función vuelve a la aplicación. De lo contrario, comprueba si el contador de enlace del i-nodo es cero. Si es cero, libera todos los bloques del archivo y el nodo i antes de volver a la aplicación.

Este mecanismo le permite "eliminar" un archivo mientras está abierto. Al mismo tiempo, la aplicación que abrió un archivo todavía tiene acceso a los datos del archivo. Entonces, JRE, en su ejemplo, todavía mantiene su versión de archivo abierta mientras hay otra versión actualizada en el disco.

Además, esta función le permite actualizar glibc (libc), la biblioteca central de todas las aplicaciones, en su sistema sin interrumpir su funcionamiento normal.

Ventanas

Hace 20 años no conocíamos ningún otro sistema de archivos que FAT en DOS. Este sistema de archivos tiene una estructura y principios de gestión diferentes. Estos principios no le permiten eliminar un archivo cuando se abre, por lo que el DOS y, últimamente, Windows deben denegar cualquier solicitud de eliminación en un archivo que esté abierto. Probablemente NTFS permitiría el mismo comportamiento que los sistemas de archivos * nix, pero Microsoft decidió mantener el comportamiento habitual de la eliminación de archivos.

Esta es la respuesta. No es corto, pero ahora tienes la idea.

Editar : Una buena lectura sobre las fuentes de Win32desorden: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Créditos a @Jon


1
Intenté cambiar el nombre del archivo del complemento mientras se ejecutaba el servidor: i.imgur.com/xibyF.png
MetaGuru el

abra la ventana de cmd, cambie a este directorio y use ren MonsterB.jar MonsterB.ja_, debería funcionar. Funciona para archivos dll y exe definitivamente.
Serge

1
no, Windows asigna partes del archivo ejecutable a la memoria
Serge

9
NTFS realmente lo admite, pero el fopencomando Biblioteca C llama CreateFilecon el FILE_SHARE_DELETEindicador, por lo que no lo permite para la mayoría de los programas que abren archivos.
Random832

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.