Каталог удаляется, когда количество жестких ссылок становится равным 0?

10

Каталог удаляется, когда количество жестких ссылок становится равным 0?

У каталога всегда есть по крайней мере 2 в качестве количества жестких ссылок, из-за .. Когда rm -rкаталог, уменьшает ли количество жестких ссылок с 2 до 0 на 2 вместо 1?

Может ли количество жестких ссылок в каталоге быть 1?

Спасибо.

Тим
источник

Ответы:

9

Во-первых, не все файловые системы используют .и ..как жесткие ссылки. это задокументировано в руководстве по поиску GNU. Я собираюсь игнорировать эти файловые системы до конца моего ответа, потому что они не были предназначены для Unix и только усложняют вещи, не добавляя ясности. Я также собираюсь игнорировать корневой каталог и точки монтирования по той же причине.

количество ссылок на каталог никогда не бывает меньше двух из-за .и ... Количество подкаталогов равно количеству ссылок минус два. Из - за этого вы не можете установить или отменить связь каталога, так rm -rбудет statфайл перед удалением и использовать rmdirвместо unlinkкаталогов. Два системных вызова используют совершенно разные пути кода в ядре.

hildred
источник
Спасибо. Каталог имеет жесткую ссылку .., только если он имеет подкаталог, правильно? Так ..что не всегда присутствует для каталога, верно?
Тим
..присутствует в каждом каталоге, который является подкаталогом. который все, но у /которого тоже есть, так что все каталоги.
Хильдред
1
(1) Если каталог не имеет подкаталога, каталог не имеет жесткой ссылки ..на себя. Какие жесткие ссылки на каталог? файл с путем, а .? (2) почему вы игнорируете точки монтирования?
Тим
Если каталог является подкаталогом. запись ..будет указывать на родителя. В особом случае ссылка на корневой каталог указывает сама на себя. Это позволяет cd ..\..и аналогичным командам работать, как и ожидалось, независимо от того, где вы находитесь. Вы можете проверить с помощью statкоманды.
BillThor
1
Вы правы, что количество ссылок никогда не меньше 2, но это не из-за ... Это потому, .что имя родительского каталога указывает на него. Единственным исключением является корень, у которого нет родителя. Но он имеет ..указание на себя, поэтому он также имеет количество ссылок = 2.
Barmar
11

Любой файл в традиционно разработанной файловой системе UNIX, чей счетчик ссылок (например, сумма счетчиков жестких ссылок и количество открытых файловых дескрипторов *) достигает 0, удаляется. Однако, на современных системах UNIX, то rmdirсистемный вызов удаляет пустой каталог в одной операции , а не удаление .и ..один за другим.

Однако в исторических системах UNIX этот системный вызов не существовал. Вместо этого rmdir команда представляла собой программу setuid ( исходный код можно найти здесь ), которая проверяла, что каталог пуст (кроме специальных записей), а затем удаляла ..и ., в этом порядке, а затем удаляла сам каталог, все с unlinkсистемный вызов, который только корневому каталогу разрешено использовать в каталогах (следовательно, почему команда была setuid). Таким образом, в этих системах счетчик ссылок каталога на мгновение будет равен 1 после .удаления, но до удаления каталога из родительского каталога он будет равен 0.

Команда rm, кстати, помешала даже root удалить каталоги. И rm -rбудет вызывать rmdirкоманду на удаление каталогов после очистки их содержимого.

В этих исторических системах неправильное использование unlinkвызова из программы, выполняющейся от имени пользователя root, находящейся в состоянии состязания с rmdirили или mv, или создание файла в процессе, текущий каталог которого был удален (современные системы предотвращают это), может привести к зависанию файлов или каталогов. которые имеют количество жестких ссылок выше 0, но не существуют в дереве каталогов. Это условие было обнаружено dcheckи остается одной из проверок, fsckпоскольку оно остается физически возможным в большинстве файловых систем.


Между прочим, файловые системы не требуются для реализации каталогов (включая .и ..) в виде обычных файлов, имеющих жесткие ссылки. В этих файловых системах счетчик жестких ссылок каталога всегда будет сообщаться как 0(но, конечно, его существование в родительском каталоге соответствует «счетчику ссылок», равному 1).


Поведение удаленного каталога (например, при проверке процессом, в котором он уже открыт или является текущим каталогом) и точное значение «счетчика ссылок» каталога не определены. Например, в Mac OS X он сообщает о количестве жестких ссылок, равном 2 , хотя реальных жестких ссылок нет. Даже если .и ..не отображаются в списке, каталог может быть открыт и statможет быть вызван с именем .или ... В Linux, счетчик ссылок равен 0 , но .и ..также по- прежнему работают.

Mac OS X также сообщает количество всех файлов в каталоге как количество ссылок, а не только количество подкаталогов. Но это 2, даже когда .и ..ушли.


* Это включает в себя обычные открытые дескрипторы, отображаемые в память разделы (включая, например, исполняемые файлы и разделяемые библиотеки) и обрабатывающие текущие каталоги.

Random832
источник
2
strcpyв массив фиксированного размера в исполняемом файле setuid ... это были хорошие времена!
Андреа Корбеллини
@AndreaCorbellini На самом деле опубликован эксплойт, mkdirоснованный на том факте, что он должен делать то же самое в обратном порядке.
Случайный 832
1
Я думаю, что нашел это: securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
Андреа Корбеллини
спрашивая о том rmdir, не удалит ли ..удаление родительский каталог?
Эдвард Торвальдс
@edwardtorvalds Нет, я имел в виду удаление самой ссылки "..", а не родительского каталога, на который она указывает.
Random832