J'ai deux obus ouverts. Le premier se trouve dans le répertoire A. Dans le second, je supprime le répertoire A, puis le recrée. Quand je reviens au premier shell et que je tape ls
, la sortie est:
ls: cannot open directory .: Stale file handle
Pourquoi? Je pensais que le premier shell (celui qui restait ouvert dans un répertoire inexistant) "se bloquerait" en attendant la prochaine commande, et n'aurait pas "réalisé" que le répertoire a été supprimé et recréé. Le shell contient-il une référence "plus profonde" à son répertoire de travail actuel autre que la chaîne $PWD
?
bash
filesystems
open-files
pwd
fonini
la source
la source
cd $PWD
.Réponses:
Un répertoire (comme tout fichier) n'est pas défini par son nom. Considérez le nom comme l' adresse du répertoire . Lorsque vous déplacez le répertoire, c'est toujours le même répertoire, tout comme si vous déménagez dans une autre maison, vous êtes toujours la même personne. Si vous supprimez un répertoire et en créez un nouveau du même nom, c'est un nouveau répertoire, tout comme quelqu'un qui s'installe dans la maison où vous habitiez n'est pas vous.
Chaque processus a un répertoire de travail . La
cd
commande dans le shell modifie le répertoire de travail actuel du shell. Lapwd
commande imprime le chemin¹ vers le répertoire de travail actuel.Lorsque vous avez supprimé le répertoire A, cela a entraîné la suppression de l'entrée pour A dans son répertoire parent. Le répertoire A lui-même est resté dans le système de fichiers, mais dans un état détaché, sans nom. Il n'a pas encore été supprimé car il était utilisé par un processus, à savoir le premier shell. Lorsque vous avez modifié le répertoire dans le premier shell, le répertoire a finalement été supprimé. La même chose se produit lorsqu'un fichier est supprimé alors qu'un processus est toujours ouvert: l'entrée de répertoire du fichier est supprimée immédiatement et le fichier lui-même est supprimé lorsqu'il cesse d'être utilisé.
De même, observez ce qui se passe lorsque vous déplacez des répertoires.
Dans un autre shell:
Dans le premier shell:
Le fichier se
1
trouve dans le répertoire qui était à l'origine appeléone
et s'appelle maintenanttwo
. Le fichier se2
trouve dans le répertoire qui était à l'origine appelétwo
et s'appelle maintenantone
.¹ Plus précisément, un chemin, qui peut ne pas être unique si des liens symboliques ou d'autres subtilités sont impliqués.
la source
/proc/<pid>/cwd
, qui fonctionne comme/proc/<pid>/fd/<number>
. C'estCWD
dans la sortie delsof
.cd - && cd -
dans ce cas?Le nouveau répertoire A n'est pas le même que le répertoire A. Il peut être vérifié avec la
stat
commande avant de supprimer l'ancien et après en avoir créé un nouveau et vous verrez différents numéros d'i-node.Et je pense que cela est lié au fonctionnement du noyau. Il garde simplement une trace du numéro i du répertoire courant pour chaque processus. Donc, comme il existe différents nombres i, cela entraînera des collisions différentes.
la source
Il s'agit d'un comportement attendu. Le nouveau répertoire A n'est pas le même que l'ancien répertoire A, il se trouve qu'il porte le même nom. Donc, le $ PWD du premier terminal est toujours parti, il n'a pas réapparu comme par magie quand vous avez fait le
mkdir A
.la source
Un répertoire, comme un fichier, est associé à un inode:
307% mkdir ABC
308% ls -i 11997708 A 11997709 B 11997710 C
Un inode est une structure de données qui contient des informations sur le répertoire ou le fichier. Chaque répertoire et fichier en a un. Considérez-le comme une adresse (un numéro d'index vraiment).
Si je suis dans A, numéro d'inode 11997708 et dans un autre shell (ou dans le même shell que je vais faire), supprimez le répertoire A puis recréez-le et ls l'inode:
309% cd A
310% rmdir ../A
311% mkdir ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C
Le nœud i est différent, donc s'il essaie de créer un fichier dans le répertoire supprimé A:
313% le touchent
toucher: ne peut pas toucher «ceci»: aucun fichier ou répertoire de ce type
parce que le répertoire dans lequel je suis - n'est plus associé à l'inode 11997720 - donc là où je suis actuellement n'a plus d'adresse / d'index légitime - inode. D'où l'erreur.
la source