Unix'te, tipik olarak, bir dosya bir dosya tablosundaki bir giriştir. Farklı dosya türleri vardır: normal dosyalar, cihazlar, sembolik bağlantılar, kapılar, borular, soketler, dizinler ...
İnode numarası (çıktısında görebileceğiniz ls -i
) bu tablodaki indekstir.
Şimdi, dosyalara inode değil yol yoluyla erişiyorsunuz . Bir yol zinciridir dizin girdileri. Burada klasörden değil, dizinden bahsettiğimizi fark edeceksiniz . Çünkü bu bir rehberdir (bir telefon rehberini düşünün).
Bir dizin, bir dizi düğüme isim veren özel bir dosya türüdür. Bir dizin girişi bir isimden bir inode'a eşlemedir.
Belirli bir dosya (inode) bir dizinde birden fazla isme sahip olabilir (bir telefon numarasında birden fazla isim olması gibi) ve ayrıca birden fazla dizinde de isimler (girişler) olabilir. Bu denir bağlantılar olarak da bilinen sabit bağlantılar ile ayırt elektronik bağlantılar (bir yol için bir işaretçi dosyası özel bir türü).
Bir dosya (inode), sahip olduğu bağlantıların (herhangi bir dizindeki girişlerin) sayısını takip eder, böylece sayı 0'a ulaştığında (başvurduğu son dizinden bağlantısı kesildiğinde), serbest bırakılır.
ls -l
Çıktıda görüntülenen sayı (bağlantı sayısı) .
Dizin olmayan bir dosya ilk kez oluşturulduğunda ( open
veya creat
(veya bind
veya mknod
bazı dosya türleri için) sistem çağrılarıyla), yeni dosyaya (benzeri "/a/b"
) bir yol sağlayarak yapılır . Daha sonra olan ise yeni bir dosya ve inode tahsis edilmiş ve kök dizindeki "a"
adla ilişkilendirilmiş dizine yeni bir giriş eklenmiştir "/"
. Bu ilk linktir, yani link sayısı birdir.
Daha sonra link()
sistem çağrısı ( ln
komut) ile daha fazla bağlantı eklenebilir . Ve bağlantılar unlink()
sistem çağrısı ( rm
komut) ile kaldırılabilir .
Type dizin dosyalarının genellikle 2'ye eşit veya daha büyük olan birkaç bağlantıya sahip olduğunu fark edeceksiniz .
Şimdi, bir dizin oluşturduğunuzda, mkdir()
sistem çağrısını çağırıyorsunuz. Gibi bir şey mkdir("/a/b")
. O zaman ne yapılacağı yeni bir tür dizin dizinidir. Bu yeni dizinde otomatik olarak iki giriş oluşturur:
"."
( dizin için nokta ). Bu da kendine bir bağlantıdır. Yani bağlantı sayısı 1'dir.
".."
(için dizin sitesindeki dizini ). Bu bir bağlantıdır "/a"
. Yani bağlantı sayısı "/a"
bir artar
Ardından bu yeni dizin bağlanır "/a"
(bunun için bir giriş eklenir "/a"
), bu nedenle bağlantı sayısı şimdi 2 olur. Bir "/a/b/c"
dizin oluşturulursa, ".."
giriş nedeniyle "/a/b/c"
, bağlantı sayısı "/a/b"
3 olur.
Çoğu Unice, bir dizine başka bağlantılar oluşturmayı kısıtlar çünkü sorunlu döngülere neden olabilirler. Bir link()
dizinde bir dizine izin verdiklerinde , genellikle yalnızca süper kullanıcı bunu yapabilir.
Gibi bazı dosya sistemleri btrfs
bu geleneksel dizin yapısından ayrılır. btrfs
Dosya sistemlerindeki dizinler üzerindeki link sayımlarının her zaman bir tane olduğunu göreceksiniz, bu dizinler "."
kendilerinde aynı inode numarasına sahip bir giriş içeriyor olsa da .
Bağlantı sayısının geleneksel olarak 2 artı alt dizin sayısının kullanımı gerçektir. Örneğin, içinde:
find . -name '*.c' -print
Eğer .
subdirs içerebilir, ancak dosyaları milyonlarca içeren etmez. Link sayısını kontrol ederek .
, find
herhangi bir alt dizin olduğunu bilemez. Bu yüzden tek find
yapmanız gereken, dizinin içeriğini okumak ve biten girişleri bildirmektir .c
( grep '\.c$'
birkaç megabaytlık dosyada olduğu gibi). Aksi takdirde, find
içeriye girecek dizinler olup olmadığını görmek için her bir dosyanın türünü kontrol etmek zorunda kalacaksınız ( lstat()
sistem çağrıları kadar sonuçlanabilir ). Tabii ki, bu tür bir optimizasyon üzerinde çalışmaz btrfs
(Linux'un modern sürümlerinde, bazı dosya sistemlerinde (dahil olmak üzere btrfs
) dosya türü de dosya girişinde saklanır getdents(2)
ve girişlerin listesini almak için kullanılan sistem çağrısı tarafından döndürülür. bir dizindelstat
hala gerekli değildir).