Каталог удаляется, когда количество жестких ссылок становится равным 0?
10
Каталог удаляется, когда количество жестких ссылок становится равным 0?
У каталога всегда есть по крайней мере 2 в качестве количества жестких ссылок, из-за .. Когда rm -rкаталог, уменьшает ли количество жестких ссылок с 2 до 0 на 2 вместо 1?
Может ли количество жестких ссылок в каталоге быть 1?
Во-первых, не все файловые системы используют .и ..как жесткие ссылки. это задокументировано в руководстве по поиску GNU. Я собираюсь игнорировать эти файловые системы до конца моего ответа, потому что они не были предназначены для Unix и только усложняют вещи, не добавляя ясности. Я также собираюсь игнорировать корневой каталог и точки монтирования по той же причине.
количество ссылок на каталог никогда не бывает меньше двух из-за .и ... Количество подкаталогов равно количеству ссылок минус два. Из - за этого вы не можете установить или отменить связь каталога, так rm -rбудет statфайл перед удалением и использовать rmdirвместо unlinkкаталогов. Два системных вызова используют совершенно разные пути кода в ядре.
Спасибо. Каталог имеет жесткую ссылку .., только если он имеет подкаталог, правильно? Так ..что не всегда присутствует для каталога, верно?
Тим
..присутствует в каждом каталоге, который является подкаталогом. который все, но у /которого тоже есть, так что все каталоги.
Хильдред
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, даже когда .и ..ушли.
* Это включает в себя обычные открытые дескрипторы, отображаемые в память разделы (включая, например, исполняемые файлы и разделяемые библиотеки) и обрабатывающие текущие каталоги.
..
, только если он имеет подкаталог, правильно? Так..
что не всегда присутствует для каталога, верно?..
присутствует в каждом каталоге, который является подкаталогом. который все, но у/
которого тоже есть, так что все каталоги...
на себя. Какие жесткие ссылки на каталог? файл с путем, а.
? (2) почему вы игнорируете точки монтирования?..
будет указывать на родителя. В особом случае ссылка на корневой каталог указывает сама на себя. Это позволяетcd ..\..
и аналогичным командам работать, как и ожидалось, независимо от того, где вы находитесь. Вы можете проверить с помощьюstat
команды...
. Это потому,.
что имя родительского каталога указывает на него. Единственным исключением является корень, у которого нет родителя. Но он имеет..
указание на себя, поэтому он также имеет количество ссылок = 2.Любой файл в традиционно разработанной файловой системе 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, даже когда
.
и..
ушли.* Это включает в себя обычные открытые дескрипторы, отображаемые в память разделы (включая, например, исполняемые файлы и разделяемые библиотеки) и обрабатывающие текущие каталоги.
источник
strcpy
в массив фиксированного размера в исполняемом файле setuid ... это были хорошие времена!mkdir
основанный на том факте, что он должен делать то же самое в обратном порядке.rmdir
, не удалит ли..
удаление родительский каталог?