Que fait Linux différemment qui me permet de supprimer / remplacer des fichiers là où Windows se plaindrait que le fichier est actuellement utilisé?

30

L'exemple que j'ai est Minecraft. Lors de l'exécution de Bukkit sous Linux, je peux supprimer ou mettre à jour les fichiers .jar dans le dossier / plugins et simplement exécuter la commande «recharger».

Sous Windows, je dois supprimer tout le processus du serveur car il se plaindra que le fichier .jar est actuellement utilisé lorsque j'essaie de le supprimer ou de le remplacer.

C'est génial pour moi, mais pourquoi cela se produit-il? Que fait différemment Linux ici?

MetaGuru
la source

Réponses:

35

Linux supprime un fichier complètement différemment de la façon dont Windows le fait. Tout d'abord, une brève explication sur la façon dont les fichiers sont gérés dans les systèmes de fichiers natifs * unix.

Le fichier est conservé sur le disque dans la structure à plusieurs niveaux appelée i-node. Chaque i-node a un numéro unique sur le système de fichiers unique. La structure i-node conserve différentes informations sur un fichier, comme sa taille, les blocs de données alloués au fichier, etc., mais pour cette réponse, l'élément de données le plus important est a link counter. Ce directoriessont les fichiers qui conservent des enregistrements sur les fichiers. Chaque enregistrement a le numéro i-node auquel il se réfère, la longueur du nom de fichier et le nom du fichier lui-même. Ce schéma permet d'avoir des «pointeurs», c'est-à-dire des «liens» vers le même fichier à différents endroits avec des noms différents. Le compteur de liens du i-node conserve en fait le nombre de liens qui se réfèrent à ce i-node.

Que se passe-t-il lorsqu'un processus ouvre le fichier? Tout d'abord, la open()fonction recherche l'enregistrement de fichier. Il vérifie ensuite si la structure en i-nœud en mémoire pour ce i-nœud existe déjà. Cela peut se produire si une application a déjà ouvert ce fichier. Sinon, le système initialise une nouvelle structure i-node en mémoire. Ensuite, le système augmente le compteur ouvert de la structure i-node en mémoire et renvoie à l'application son descripteur de fichier.

L'appel de bibliothèque Linux pour supprimer un fichier est appelé unlink. Cette fonction supprime l'enregistrement de fichier d'un répertoire et décrémente le compteur de liens du i-node. Si le système a découvert qu'une structure i-node en mémoire existe et que son compteur ouvert n'est pas nul, cet appel renvoie le contrôle à l'application. Sinon, il vérifie si le compteur de liens est devenu nul et si c'est le cas, le système libère tous les blocs alloués au nœud i et au nœud lui-même et revient à l'application.

Que se passe-t-il lorsqu'une application ferme un fichier? La fonction close()décrémente le compteur ouvert et vérifie sa valeur. Si la valeur est différente de zéro, la fonction retourne à l'application. Sinon, il vérifie si le compteur de liens i-node est nul. S'il est nul, il libère tous les blocs du fichier et du i-node avant de revenir à l'application.

Ce mécanisme vous permet de "supprimer" un fichier lors de son ouverture. Dans le même temps, l'application qui a ouvert un fichier a toujours accès aux données du fichier. Ainsi, JRE, dans votre exemple, conserve toujours sa version de fichier ouverte pendant qu'il existe une autre version mise à jour sur le disque.

De plus, cette fonctionnalité vous permet de mettre à jour la glibc (libc) - la bibliothèque principale de toutes les applications - dans votre système sans interrompre son fonctionnement normal.

les fenêtres

Il y a 20 ans, nous ne connaissions pas d'autre système de fichiers que FAT sous DOS. Ce système de fichiers a une structure et des principes de gestion différents. Ces principes ne vous permettent pas de supprimer un fichier lorsqu'il est ouvert, de sorte que le DOS et récemment Windows doivent refuser toute demande de suppression sur un fichier ouvert. NTFS autoriserait probablement le même comportement que les systèmes de fichiers * nix, mais Microsoft a décidé de conserver le comportement habituel de la suppression de fichiers.

Telle est la réponse. Pas court, mais maintenant vous avez l'idée.

Edit : Une bonne lecture sur les sources de Win32dégâts: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Crédits à @Jon

Serge
la source
1
J'ai essayé de renommer le fichier du plug-in lors de l'exécution du serveur: i.imgur.com/xibyF.png
MetaGuru
ouvrez la fenêtre cmd, accédez à ce répertoire et utilisez ren MonsterB.jar MonsterB.ja_- cela devrait fonctionner. Cela fonctionne certainement pour les fichiers dll et exe.
Serge
1
non, Windows mappe des parties du fichier exécutable en mémoire
Serge
9
NTFS le prend en charge, mais la fopencommande de la bibliothèque C appelle CreateFileavec l' FILE_SHARE_DELETEindicateur, il la désactive donc pour la plupart des programmes qui ouvrent des fichiers.
Random832
2
Lien obligatoire de Raymond Chen: blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Jon