Comment les commandes UNIX mv et rm fonctionnent-elles avec les fichiers ouverts?

si je suis en train de lire un fichier stocké sur un système de fichiers NTFS, et que j'essaie de déplacer/renommer ce fichier pendant qu'il est encore en lecture, Je ne peux pas le faire. Si je l'essaie sur un système de fichiers UNIX tel que EXT3, il réussit, et le processus de lecture n'est pas affecté. Je peux même gérer le fichier et les processus de lecture ne sont pas affectés. Comment cela fonctionne? Quelqu'un pourrait-il m'expliquer pourquoi ce comportement est pris en charge par les systèmes de fichiers UNIX mais pas par NTFS? J'ai un vague sentiment que ça a à voir avec le dur des liens et des inodes, mais j'aimerais avoir une bonne explication.

12
demandé sur jl6 2011-03-07 15:47:08

2 réponses

les systèmes de fichiers Unix utilisent un comptage de référence et une architecture à deux couches pour trouver des fichiers.

le nom du fichier fait référence à quelque chose appelé inode , pour noeud d'information ou noeud d'index. L'inode stocke (un pointeur vers) le contenu du fichier ainsi que certaines métadonnées, comme le type du fichier (ordinaire, répertoire, périphérique, etc.) et qui en est propriétaire.

plusieurs noms de fichiers peuvent se référer au même inode; ils sont alors appelés liens en dur . De plus, un descripteur de fichier (fd) fait référence à un inode. Un fd est le type d'objet qu'un processus obtient lorsqu'il ouvre un fichier.

un fichier dans un système de fichiers Unix ne disparaît que lorsque la dernière référence à ce fichier a disparu, donc lorsqu'il n'y a plus de noms (liens durs) ou de références de fd. Ainsi, rm ne supprime pas réellement un fichier; il supprime une référence à un fichier.

cette configuration du système de fichiers peut sembler confuse et elle pose parfois des problèmes (esp. avec NFS), mais il a l'avantage que le verrouillage n'est pas nécessaire pour beaucoup d'applications. De nombreux programmes Unix utilisent également la situation à leur avantage en ouvrant un fichier temporaire et en le supprimant immédiatement après. Dès qu'ils se terminent, même s'ils crashent, le fichier temporaire disparaît.

24
répondu Fred Foo 2011-09-28 21:33:16

Sur unix, un fichier est simplement un lien vers le fichier réel(inode). L'ouverture d'un fichier crée également un (temporaire) d'un lien vers le fichier. Lorsque tous les liens vers un fichier ont disparu (rm et close ()), le fichier est supprimé.

sur NTFS, logiquement le nom de fichier est le fichier. Il n'y a pas de couche d'indirection entre le nom du fichier et le fichier metaffo, c'est le même objet. Si vous l'ouvrez, il est utilisé et ne peut pas être enlevé, tout comme le réel le fichier (inode) sur unix ne peut pas être supprimé pendant son utilisation.

Unix: Nom De Fichier -> FileInfo -> Fichier De Données

NTFS: Nom De Fichier/FileInfo -> Fichier De Données

4
répondu Erik 2011-03-07 12:53:22