Чи видаляється каталог, коли кількість жорстких посилань стає 0?


10

Чи видаляється каталог, коли кількість жорстких посилань стає 0?

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

Чи може кількість жорстких посилань каталогів колись дорівнювати 1?

Дякую.

Відповіді:


9

По-перше, не всі файлові системи використовують .і ..як жорсткі посилання. це задокументовано в посібнику з пошуку гну. Я збираюся ігнорувати ці файлові системи в решті моєї відповіді, оскільки вони не були розроблені для unix і лише ускладнюють речі, не додаючи ясності. Я також ігнорую кореневий каталог та точки монтування з тієї ж причини.

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


Дякую. Каталог має жорстке посилання .., лише коли він має підкаталог, правильно? Тож ..не завжди присутній для каталогу, правда?
Тім

..присутній у кожному каталозі, який є підкаталогом. який є всім, але /який теж має його, тому всі каталоги.
hildred

1
(1) Якщо в каталозі немає підкаталогу, каталог не має жорсткого посилання ..на себе. Які жорсткі зв’язки з режисером? файл із назвою шляху, і .? (2) чому ви ігноруєте точки кріплення?
Тім

Якщо каталог - це підкаталог. запис ..буде вказувати на батьків. Як особливий випадок посилання кореневого каталогу вказує на себе. Це дозволяє cd ..\..і подібним командам працювати, як очікувалося, незалежно від того, де ви знаходитесь. Ви можете протестувати за допомогою statкоманди.
BillThor

1
Ви правильні, що кількість посилань ніколи не менша за 2, але це не через ... Саме тому .і назва в батьківському каталозі вказує на нього. Єдиний виняток - корінь, у якого немає батьків. Але вона ..вказує на себе, тому вона також має кількість посилань = 2.
Бармар

11

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

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

rmКоманда, до речі, запобігти навіть корінь від видалення каталогів. І rm -rзакликає rmdirкоманду видалити каталоги після випорожнення їх вмісту.

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


Файлові системи, до речі, не вимагають реалізації каталогів (включаючи .і ..) як звичайні файли, що мають жорсткі посилання. У цих файлових системах кількість твердих 0посилань каталогів завжди буде повідомлятися як (але, звичайно, його існування в батьківському каталозі кваліфікується як "кількість посилань" 1).


Поведінка вилученого каталогу (наприклад, коли він перевіряється процесом, який він уже відкрив, або має його як поточний каталог) та точне значення "кількості посилань" каталогу не визначено. Наприклад, на Mac OS X він повідомляє про кількість посилань на 2 , хоча у нього немає справжніх посилань. Навіть якщо .і ..не з'являється в списку, каталог може бути відкритий і statможе бути викликаний з ім'ям .або ... У Linux, лічильник посилань дорівнює 0 , але .і ..також по- , як і раніше працюють.

Mac OS X також повідомляє про кількість всіх файлів у каталозі як кількість посилань, а не лише кількість підкаталогів. Але це 2 навіть коли .і ..пішли.


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


2
strcpyдо масиву фіксованого розміру у встановленому виконанні ... це були гарні часи!
Андреа Корбелліні

@AndreaCorbellini Існує фактично опублікований подвиг, що mkdirґрунтується на тому, що він повинен робити те ж саме у зворотному порядку.
Випадково832


питаючи про rmdir, чи не вилучив ..би батьківський каталог видалити?
Едвард Торвальдс

@edwardtorvalds Ні, я мав на увазі видалення посилання "..", а не батьківський каталог, на який він вказує.
Випадково832
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.