У меня есть две открытые оболочки. Первый находится в каталоге A. Во втором я удаляю каталог A, а затем воссоздаю его. Когда я возвращаюсь к первой оболочке и печатаю ls
, вывод:
ls: cannot open directory .: Stale file handle
Почему? Я думал, что первая оболочка (та, которая осталась открытой в несуществующем каталоге) будет «зависать» во время ожидания следующей команды и не «осознает», что каталог был удален и создан заново. Содержит ли оболочка «более глубокую» ссылку на свой текущий рабочий каталог, кроме строки $PWD
?
bash
filesystems
open-files
pwd
Фоньини
источник
источник
cd $PWD
.Ответы:
Каталог (как и любой файл) не определяется его именем. Подумайте о том , как имя самого каталога адрес . Когда вы перемещаете каталог, он остается тем же каталогом, точно так же, как если вы переезжаете в другой дом, вы все тот же человек. Если вы удаляете каталог и создаете новый с тем же именем, это новый каталог, точно так же, как кто-то, кто переезжает в дом, где вы жили, не вы.
У каждого процесса есть рабочий каталог . Команда
cd
в оболочке изменяет текущий рабочий каталог оболочки. Командаpwd
выводит путь к текущему рабочему каталогу.Когда вы удалили каталог A, он удалил запись для A в родительском каталоге. Сам каталог A остался в файловой системе, но в отдельном состоянии, без имени. Он еще не был удален, потому что он использовался процессом, а именно первой оболочкой. Когда вы изменили каталог в первой оболочке, каталог был окончательно удален. То же самое происходит, когда файл удаляется, когда процесс все еще имеет его: запись каталога в файле немедленно удаляется, а сам файл удаляется, когда он перестает использоваться.
Точно так же наблюдайте, что происходит, когда вы перемещаете каталоги.
В другой оболочке:
В первой оболочке:
Файл
1
находится в каталоге, который изначально вызывалсяone
и теперь называетсяtwo
. Файл2
находится в каталоге, который изначально вызывалсяtwo
и теперь называетсяone
.¹ Точнее, путь, который не может быть уникальным , если символические ссылки или другие тонкости участвуют.
источник
/proc/<pid>/cwd
, что работает как/proc/<pid>/fd/<number>
. ЭтоCWD
в выводеlsof
.cd - && cd -
в таком случае?Новый каталог A отличается от каталога A. Его можно проверить с помощью
stat
команды перед удалением старого и после создания нового, и вы увидите разные номера i-узлов.И я думаю, что это связано с тем, как работает ядро. Он просто отслеживает i-номер текущего каталога для каждого процесса. Так как есть разные i-числа, это приведет к различным столкновениям.
источник
Это ожидаемое поведение. Новый каталог A не совпадает со старым каталогом A, просто он имеет то же имя. Таким образом, $ PWD первого терминала все еще не существует, он волшебным образом не появился, когда вы сделали
mkdir A
.источник
С каталогом, как и с файлом, связан индекс:
307% мкдр азбуки
308% ls -i 11997708 A 11997709 B 11997710 C
Inode - это структура данных, которая содержит информацию о каталоге или файле. Каждый каталог и файл имеет один. Думайте об этом как адрес (индексный номер действительно).
Если я нахожусь в A, инод номер 11997708 и в другой оболочке (или в той же оболочке, что и собираюсь) удалить каталог A, затем воссоздать его и ls индекс:
309% кд А
310% рмдир ../A
311% мкдир ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C
Узел i отличается, поэтому, если он попытается создать файл в удаленном каталоге A:
313% касаются этого
Touch: не может коснуться «это»: нет такого файла или каталога
потому что каталог, в котором я нахожусь, больше не связан с индексом 11997720, поэтому там, где я в данный момент больше не имею допустимого адреса / индекса - индекс. Таким образом, ошибка.
источник