2015-09-14 5 views
0

Я пытаюсь найти этот ответ во всем, но не нашел его. Давайте возьмем пример первый:Что на самом деле происходит, если вы удаляете рабочий каталог, как это делает ядро?

$ cd /tmp 
$ mkdir foo 
$ cd foo 
$ pwd 
/tmp/foo 
$ $SHELL 
$ rmdir /tmp/foo 
$ exit 
$ pwd 
/tmp/foo 
$ ls 
<no output> 
$ man ls 
man: can't change directory to '': No such file or directory 
man: command exited with status 255: (cd && LESS=-ix8RmPm Manual page ls(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$PM Manual page ls(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$ MAN_PN=ls(1) pager -s) 
$ echo -e '#include<unistd.h>\n#include<stdio.h>\n#include<stdlib.h>\nint main(){char*p=getcwd(NULL,0);printf("%s\\n",p);free(p);}' | gcc -x c - 
/usr/bin/ld: cannot open output file a.out: No such file or directory 
collect2: error: ld returned 1 exit status 
$ cd $PWD 
cd: no such file or directory: /tmp/foo 

Что здесь происходит внутренне? Как ядро ​​справляется с такими ситуациями? Если предполагается, что текущий каталог остается в виде дескриптора файла, Почему все эти команды не работают?

И, (по крайней мере, для меня), что еще более важно, почему есть no Защита от такого рода вещей? Мне кажется, что это может привести к серьезным проблемам безопасности легко ...

ответ

3

При удалении каталога, то выполняются следующие действия:

  • ссылка на каталог, в его родителя удаляется
  • .. ссылка в каталоге его родителя удаляются
  • . ссылки в каталоге себе удаляются

как каждый из Феса e, номер ссылки в каталоге удаляется. Когда счетчик ссылок становится 0, сам каталог удаляется из файловой системы.

Если есть какие-либо процессы, обращающиеся к каталогу (либо в качестве рабочего каталога, либо потому, что они вызвали opendir()), это также увеличит количество ссылок на каталог. Таким образом, каталог не исчезает, пока все эти обращения не исчезнут.

Пока каталог находится в этом состоянии, его можно прочитать, но все, что зависит от любой из приведенных выше ссылок, не будет выполнено. Когда вы делаете cd $PWD, он пытается сделать cd /tmp/foo, но ссылка foo была удалена.

+0

Это не объясняет, почему такие вещи, как «человек» или даже «прикосновение», терпят неудачу. – 3442

+0

Сообщение об ошибке из 'man' объясняет это: он пытается перейти к текущему каталогу, но имя не существует. – Barmar

+0

«Переход к текущему каталогу». - Разве это уже не процесс? – 3442

 Смежные вопросы

  • Нет связанных вопросов^_^