web-dev-qa-db-fra.com

Que veut dire 'traitement de fichier obsolète' dans Linux?

Supposons que j'ai un terminal ouvert et que, par ce biais, j'ai cd 'ed dans un répertoire. À travers un autre terminal, je supprime ce répertoire et le restaure à partir d’une sauvegarde identique. Quand j'essaie de vim un fichier du premier terminal, dans le même répertoire, pourquoi ai-je une erreur concernant un descripteur de fichier périmé? Qu'est-ce que ça veut dire? (Sur une note de côté, j'ai trouvé qu'il est possible de contourner ce problème par cd $(pwd).)

85
IDDQD

Lorsque le répertoire est supprimé, inode pour ce répertoire (et les inodes pour son contenu) est recyclé. 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 sont non (nécessairement) réutilisés; le répertoire et son contenu sont stockés sur des inodes aléatoires. La seule chose qui reste identique est que le répertoire parent réutilise le même nom pour le répertoire restauré (parce que vous le lui avez dit).

Désormais, si vous essayez d'accéder au contenu du répertoire vers lequel pointe votre shell d'origine, il communique cette requête au système de fichiers en tant que requête pour l'inode d'origine, qui a depuis été recyclé (et peut même être utilisé pour quelque chose). entièrement différent maintenant). Vous obtenez donc un message stale file handle parce que vous avez demandé des données inexistantes.

Lorsque vous effectuez une opération cd, le shell réévalue l'emplacement d'inode de la destination que vous lui donnez. Maintenant que votre Shell connaît le nouvel inode du répertoire (et les nouveaux inodes pour son contenu), les futures demandes concernant son contenu seront valides.

70
dg99