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 directories
sont 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 Win32
dégâts: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Crédits à @Jon
ren MonsterB.jar MonsterB.ja_
- cela devrait fonctionner. Cela fonctionne certainement pour les fichiers dll et exe.fopen
commande de la bibliothèque C appelleCreateFile
avec l'FILE_SHARE_DELETE
indicateur, il la désactive donc pour la plupart des programmes qui ouvrent des fichiers.