Qu'est-ce que Linux fait différemment qui me permet de supprimer / replace des files où Windows se plaindrait que le file est actuellement en cours d'utilisation?

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

Dans Windows, je dois prendre tout le process du server car il se plaindra que le file .jar est actuellement utilisé lorsque j'essaie de le retirer ou de le replace.

C'est génial pour moi, mais pourquoi cela arrive-t-il? Qu'est-ce que Linux fait différemment ici?

Linux supprime un file complètement différent de celui de Windows. Tout d'abord, une brève explication sur la gestion des files dans les filesystems natifs * unix.

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

Que se passe-t-il lorsqu'un process ouvre le file? Tout d'abord, la fonction open() search l'logging du file. Ensuite, il vérifie si la structure i-node en memory de cet i-node existe déjà. Cela peut se produire si certaines applications avaient déjà ouvert ce file. Sinon, le système initialise une nouvelle structure i-node en memory. Ensuite, le système augmente le countur d'ouverture de la structure i-node en memory et returnne à l'application son descripteur de file.

L'appel de la bibliothèque Linux pour supprimer un file s'appelle unlink . Cette fonction supprime l'logging du file d'un directory et décrémente le countur de liens du i-node. Si le système a constaté qu'une structure i-node en memory existe et que son countur ouvert n'est pas à zéro, cet appel renvoie le contrôle à l'application. Sinon, il vérifie si le countur de liens est devenu zéro et si c'est le cas, le système libère tous les blocs alloués pour le nœud i et le nœud i lui-même et returnne à l'application.

Qu'arrive-t-il qu'une application ferme un file? La fonction close() décrémente le countur ouvert et vérifie sa valeur. Si la valeur est différente de zéro, la fonction returnne à l'application. Sinon, il vérifie si le countur de binding i-node est égal à zéro. S'il est égal à zéro, il libère tous les blocs du file et de l'i-node avant de revenir à l'application.

Ce mécanisme vous permet de "supprimer" un file pendant qu'il est ouvert. Dans le même time, l'application qui a ouvert un file a toujours access aux données du file. Ainsi, JRE, dans votre exemple, conserve toujours sa version du file ouverte alors qu'il existe une autre version mise à jour sur le disque.

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

les windows

Il y a 20 ans, nous ne connaissions aucun autre système de files que FAT sous DOS. Ce système de files a une structure et des principes de gestion différents. Ces principes ne vous permettent pas de supprimer un file lorsqu'il est ouvert, de sorte que le DOS et dernièrement Windows doit refuser toute request de suppression sur un file qui est ouvert. Probablement NTFS permettrait le même comportement que les filesystems * nix, mais Microsoft a décidé de maintenir le comportement habituel de la suppression du file.

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

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