Je viens de renommer un fichier journal en "foo.log.old" et j'ai supposé que l'application commencerait à écrire un nouveau fichier journal dans "foo.log". J'ai été surpris de découvrir qu'il suivait le fichier journal jusqu'à son nouveau nom et continuait d'ajouter des lignes à "foo.log.old".
Sous Windows, je ne connais pas ce type de comportement - je ne sais pas s'il est même possible de l'implémenter. Comment ce comportement est-il implémenté exactement sous Linux? Où puis-je en savoir plus à ce sujet?
files
open-files
rename
ripper234
la source
la source
Réponses:
Les programmes se connectent aux fichiers via un numéro maintenu par le système de fichiers (appelé un inode sur les systèmes de fichiers Unix traditionnels), dont le nom n'est qu'une référence (et peut-être pas une référence unique à cela).
Donc, plusieurs choses à savoir:
mv
ne modifie pas ce numéro sous-jacent à moins que vous ne le déplaciez sur les systèmes de fichiers (ce qui équivaut à utilisercp
ensuiterm
sur l'original).open
un fichier, il y fait référence, ce qui équivaut (aux fins de la suppression des données) à avoir un nom de fichier connecté.Cela donne lieu à plusieurs comportements comme:
open
lire un fichier, mais ne le lit réellement qu'après que l'utilisateur l'aitrm
édité sur la ligne de commande, et le programme aura toujours accès aux données .mv
ing un fichier ne déconnecte pas la relation entre le fichier et les programmes qui l'ouvrent (à moins que vous ne traversiez les limites du système de fichiers, auquel cas le programme a toujours une version de l'original sur laquelle travailler).open
édité un fichier pour l'écriture et que l'utilisateurrm
est son dernier nom de fichier sur la ligne de commande, le programme peut continuer à mettre des éléments dans le fichier, mais dès qu'il se ferme, il n'y aura plus de référence à ces données et cela disparaîtra.open
. (Ce n'est pas un véritable esprit de sécurité, cela transforme simplement un trou béant en condition de course.)la source
open
un fichier pour la lecture et l'écriture (comme ce qui s'est passé avec le fichier journal dans la question).Pour vraiment voir comment ce comportement est implémenté, vous pouvez regarder quelques livres de programmation Unix. Mathepic a raison en ce qu'il est lié à un inode. Le nom de chemin réel n'est utilisé que pour ouvrir le fichier, une fois cela fait, le programme le référence par son descripteur de fichier ouvert. Le descripteur de fichier fait à son tour référence à l'inode, qui dans ce cas ne se soucie pas si le nom des fichiers sous-jacents a changé.
En ce qui concerne l'implémentation de cela dans Windows, c'est une question pour un autre site.
Pour en savoir plus à ce sujet sans toucher aux livres, recherchez simplement les systèmes de fichiers Linux et les inodes. Il n'y a peut-être pas de réponse claire, mais vous pourrez comprendre pourquoi.
la source