Dlaczego nowy katalog ma twardą liczbę linków równą 2, zanim cokolwiek zostanie do niego dodane?

38

Powiedzmy, że właśnie utworzyłem katalog newDirectory, a następnie wykonuję polecenie ls -ld. Widzę, że liczba twardych linków wynosi 2. Co dokładnie sprawia, że ​​twarde linki 2 od samego początku? Czy liczba podkatalogów w bieżącym katalogu jest równa liczbie dowiązań twardych - 2?

Jan
źródło

Odpowiedzi:

39

Historycznie , pierwszy system plików Unix utworzył dwa wpisy w każdym katalogu: .wskazując na sam katalog i ..wskazując na jego element nadrzędny. Zapewniło to łatwy sposób przechodzenia przez system plików, zarówno w przypadku aplikacji, jak i samego systemu operacyjnego.

Tak więc każdy katalog ma liczbę linków równą 2 + n, gdzie n jest liczbą podkatalogów. Łącza są pozycją dla tego katalogu w jego katalogu nadrzędnym, własną .pozycją katalogu i ..pozycją w każdym podkatalogu. Załóżmy na przykład, że jest to zawartość poddrzewa zrootowanego we /parentwszystkich katalogach:

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

Wtedy dirma liczbę linków 5: dirwpis /parent, ten .wpis /parent/dir, a trzy ..wpisy w każdej /parent/dir/sub1, /parent/dir/sub2oraz /parent/dir/sub3. Ponieważ /parent/dir/sub1nie ma podkatalogu, jego liczba linków wynosi 2 ( sub1wpis /parent/diri .wpis w /parent/dir/sub1).

Aby zminimalizować ilość specjalnej obudowy dla katalogu głównego, który nie ma „właściwego” elementu nadrzędnego, katalog główny zawiera ..pozycję wskazującą na siebie. Również w ten sposób liczba linków wynosi 2 plus liczba podkatalogów, przy czym 2 to /.i /...

Późniejsze systemy plików miały tendencję do śledzenia katalogów nadrzędnych w pamięci i zwykle nie potrzebują .i ..istnieją jako rzeczywiste wpisy; typowe współczesne systemy uniksowe traktują .i ..jako specjalne wartości jako część kodu systemu plików niezależnego od typu systemu plików. Niektóre systemy plików wciąż zawierają wpisy .i ..wpisy lub udają, że nic nie pojawia się na dysku.

Większość systemów plików nadal zgłosić liczbę linków 2 + n dla katalogów niezależnie od tego, czy .i ..istnieją wpisy, ale istnieją wyjątki, np btrfs nie to zrobić.

Gilles „SO- przestań być zły”
źródło
4
..wskazanie elementu nadrzędnego nie wpływa na liczbę łączy w bieżącym katalogu. Liczba 2 pochodzi z .samej listy (oryginalnej) nazwy katalogu. Sposób, w jaki to ujmujesz, jest trochę niejednoznaczny i sprawia, że ​​brzmi jak .i ..są nimi dwoje. ..należy używać wyłącznie do wyjaśnienia, jak działa matematyka 2+n:)
th3an0maly
@ th3an0maly Wskazanie na rodzica wpływa na liczbę łączy rodzica. Naprawdę nie rozumiem, jak „wpis .. w każdym podkatalogu” jest niejednoznaczny i nie rozumiem, co rozumiesz przez „samą listę nazw katalogów”.
Gilles „SO- przestań być zły”
Właściwie ta odpowiedź: unix.stackexchange.com/a/101516/160264 jest dokładnie tym, o czym wspomniałem . Przeczytaj to po przeczytaniu twojej odpowiedzi, ponieważ Twoja była tą na górze.
th3an0maly
@ th3an0maly Nadal nie mam pojęcia o czym mówisz. Czy możesz wyrazić to wyraźnie, zamiast podpowiedzi?
Gilles „SO- przestań być zły”
Odpowiedź goldilocks jest jasna. Chciałem powiedzieć, że twoja odpowiedź może być bardziej podobna do jego. Ale potem nie przeczytałem jego odpowiedzi, kiedy czytałem twoją odpowiedź. Pierwszy wiersz jest dokładnie tym, co powiedział mój oryginalny komentarz: „Jest jeden dla samego katalogu i jeden dla .niego”. Jeśli nadal jest to dla ciebie niejasne, bardzo przykro mi, że nie jestem w stanie wyjaśnić więcej. Wszystko, co mogłem zrobić lepiej, to skopiować i wkleić jego odpowiedź tutaj w komentarzach.
th3an0maly
13

Jest jeden dla samego katalogu i jeden dla .niego.

Czy liczba podkatalogów w bieżącym katalogu jest równa liczbie dowiązań twardych - 2?

Ma to sens, ponieważ każdy podkatalog tworzy ..łącze twarde, a ponadto nie można tworzyć łączy twardych do katalogów. 1 Jednak nie ufałbym temu za coś poważnego, szczególnie. ponieważ łatwo policzyć podkatalogi i uzyskać rzeczywistą liczbę.

Jeśli patrzysz na lswynik, aby dowiedzieć się, ile jest subwooferów, to daje ci przyzwoity pomysł.

1 A przynajmniej nie możesz ln. Nie próbowałem programowo i man 2 linkjest dwuznaczny - nie ma oczywistego błędu w łączeniu się z katalogiem, chociaż może być kilka, które mogą mieć zastosowanie ( EMLINK, EPERM). Więc jeśli nie ma gdzieś jakiegoś standardu, który mówi, że jedynymi możliwymi twardymi linkami do katalogu są, .i ..znowu, traktowałbym ten twardy link jako zwykłą wskazówkę.

Złotowłosa
źródło
2
To, czy łącza do katalogów są dozwolone i czy można policzyć podkatalogi z liczby łączy, zależą od używanego systemu plików - niektóre zezwalają, niektóre nie.
alanc
Zauważ, że Time Machine systemu macOS faktycznie łączy linki do katalogów z poprzednimi kopiami zapasowymi; w ten sposób mogą udawać, że każda przyrostowa kopia zapasowa jest pełną kopią, i mogą usuwać dowolne przyrostowe, nie wpływając na pozostałe. Jest również bardzo kruchy, bawiłem się nim za pomocą zwykłych wywołań systemowych i dokładnie ukryłem swój system plików.
w00t