Любой файл в традиционно разработанной файловой системе 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, даже когда .и ..ушли.
* Это включает в себя обычные открытые дескрипторы, отображаемые в память разделы (включая, например, исполняемые файлы и разделяемые библиотеки) и обрабатывающие текущие каталоги.
.., только если он имеет подкаталог, правильно? Так..что не всегда присутствует для каталога, верно?