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

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

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

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

Спасибо.

10 голосов | спросил Tim 7 Mayam15 2015, 02:05:26

2 ответа


9

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

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

ответил hildred 7 Mayam15 2015, 02:25:53
11

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

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

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

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


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


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

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


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

ответил Random832 7 Mayam15 2015, 06:59:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132