Disons que j'ai un terminal ouvert, et à travers ce terminal, je suis cd
allé dans un répertoire. Via un autre terminal, je supprime ce répertoire et le restaure à partir d'une sauvegarde identique. Lorsque j'essaie d' vim
accéder à un fichier depuis le premier terminal, dans le même répertoire, pourquoi est-ce que j'obtiens une erreur concernant un descripteur de fichier périmé? Qu'est-ce que ça veut dire? (Sur une note latérale, j'ai trouvé qu'il est possible de contourner ce problème cd $(pwd)
.)
100
touch
sur l'hôte A peut le rendre normal.Réponses:
Lorsque le répertoire est supprimé, l' inode de ce répertoire (et les inodes de son contenu) sont recyclés. Le pointeur de votre shell sur l'inode de ce répertoire (et les inodes de son contenu) n'est plus valide. Lorsque le répertoire est restauré à partir d'une sauvegarde, les anciens inodes ne sont pas (nécessairement) réutilisés; le répertoire et son contenu sont stockés sur des inodes aléatoires. La seule chose qui reste la même est que le répertoire parent réutilise le même nom pour le répertoire restauré (car vous le lui avez dit).
Maintenant, si vous essayez d'accéder au contenu du répertoire sur lequel votre shell d'origine pointe toujours, il communique cette demande au système de fichiers en tant que demande de l'inode d'origine, qui a depuis été recyclé (et peut même être utilisé pour quelque chose entièrement différent maintenant). Vous recevez donc un
stale file handle
message car vous avez demandé des données inexistantes.Lorsque vous effectuez une
cd
opération, le shell réévalue l'emplacement d'inœud de la destination que vous lui donnez. Maintenant que votre shell connaît le nouvel inode pour le répertoire (et les nouveaux inodes pour son contenu), les futures requêtes pour son contenu seront valides.la source