Чому новий каталог має кількість важких посилань 2, перш ніж щось до нього буде додано?


38

Скажіть, я просто створюю каталог newDirectory, а потім виконую команду ls -ld. Я бачу, що кількість жорстких посилань становить 2. Що саме робить жорстке посилання 2 з самого початку? Чи також кількість підкаталогів у поточному каталозі дорівнює кількості жорстких посилань - 2?


Надзвичайно подібні або пов’язані питання: unix.stackexchange.com/questions/22664/… , unix.stackexchange.com/questions/22664/… , unix.stackexchange.com/questions/21847/…
Брюс

Відповіді:


39

Історично перша файлова система Unix створила два записи у кожному каталозі: .вказівку на саму директорію та ..вказівку на її батьківську. Це забезпечило простий спосіб перемістити файлову систему як для додатків, так і для самої ОС.

Таким чином, кожен каталог має кількість посилань 2 + n, де n - кількість підкаталогів. Посилання - це запис для цього каталогу у його батьківському, власний .запис у каталозі та ..запис у кожному підкаталозі. Наприклад, припустимо, що це вміст піддірення, корінням якого є /parentвсі каталоги:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Потім dirмає кількість посилань 5: dirзапис /parent, .запис /parent/dirта три ..записи у кожному з /parent/dir/sub1, /parent/dir/sub2та /parent/dir/sub3. Оскільки /parent/dir/sub1немає підкаталогу, кількість його посилань дорівнює 2 ( sub1запис /parent/dirта .запис у /parent/dir/sub1).

Щоб звести до мінімуму кількість спеціальних кожухів для кореневого каталогу, який не має "належного" батька, кореневий каталог містить ..запис, що вказує на себе. Таким чином, він також має кількість посилань 2 плюс кількість підкаталогів, 2 є /.і /...

Пізніші файлові системи, як правило, відслідковують батьківські каталоги в пам'яті і зазвичай не потребують .і ..існують як фактичні записи; типові сучасні системи Unix трактують .і ..як особливі значення як частина файлової системи, незалежної від типу файлової системи. Деякі файлові системи все ще містять .і ..записують, або роблять вигляд, що нічого не з'являється на диску.

Більшість файлових систем все ще повідомляють про кількість посилань 2 + n для каталогів незалежно від того, існують .і ..записи, але є винятки, наприклад, btrfs цього не робить.


4
..вказівка ​​на батьків не впливає на кількість посилань поточного каталогу. Кількість 2 походить від .і вказується сам список (оригінальне) ім'я каталогу. Те , як ви покласти його трохи неоднозначним, і робить його звук , як .і ..в два. ..слід використовувати лише для пояснення того, як працює математика 2+n:)
th3an0maly

@ th3an0maly Вказівка ​​на батьків впливає на кількість посилань батьків. Я дійсно не бачу, як "запис у кожному підкаталозі" є неоднозначним, і я не розумію, що ви маєте на увазі під "переліченням імені каталогу".
Жил "ТАК - перестань бути злим"

Власне, ця відповідь: unix.stackexchange.com/a/101516/160264 - саме те, на що я натякав. Прочитайте її після того, як я прочитав вашу відповідь, оскільки ваша була та сама вгорі.
th3an0maly

@ th3an0maly Я досі не маю уявлення, на що ти натякаєш. Чи можете ви чітко це висловити, а не натякати?
Жил "ТАК - перестань бути злим"

@ відповідь goldilocks зрозуміла. Що я хотів сказати, це те, що ваша відповідь може бути більше схожою на його. Але тоді я не читав його відповіді, коли я читав вашу відповідь. Перший рядок - це саме те, що сказано в моєму первинному коментарі: "Є один для самого каталогу, і один для .нього". Якщо вам все ще незрозуміло, я дуже шкодую, що не можу далі уточнити. Все, що я міг зробити краще, - скопіювати + вставити його відповідь тут у коментарях.
th3an0maly

13

Один для самого каталогу і один для .нього.

Чи також кількість підкаталогів у поточному каталозі дорівнює кількості жорстких посилань - 2?

Це має сенс, оскільки кожен підкаталог створює ..жорстке посилання, а крім цього ви не можете створювати жорсткі посилання на каталоги. 1 Однак я б не вірив цьому в чомусь серйозному, особливо. оскільки легко підрахувати підкаталоги та отримати дійсне число.

Якщо ви просто дивитесь на lsвисновок про уявлення про те, скільки є допоміжних станцій, то це дає вам гідну ідею.

1 Або, принаймні, не можна ln. Я не намагався програмно, і man 2 linkнеоднозначно - немає очевидної помилки при посиланні на каталог, хоча є пара, яка може застосувати ( EMLINK, EPERM). Тому, якщо десь є стандарт, який говорить, що єдині можливі жорсткі посилання на каталог є, .і .., знову ж таки, я б вважав, що цей жорсткий посилання вважається випадковим підказом.


2
Чи дозволені посилання на каталоги та чи можна порахувати підкаталоги за кількістю посилань, залежать від того, яку файлову систему ви використовуєте - деякі дозволяють, а інші ні.
alanc

Зауважте, що Time Machine macOS насправді жорсткі посилання на попередні резервні копії; таким чином вони можуть зробити вигляд, що кожна додаткова резервна копія є повноцінною копією, і вони можуть видалити будь-який з додаткових копій, не впливаючи на інші. Це також дуже крихко, я грав з ним за допомогою звичайних системних дзвінків, і я ретельно зчепив свою файлову систему.
w00t
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.