Yanıtlar:
Öncelikle tüm dosya sistemlerini kullanmak .
ve ..
sert bağlantılar gibi. bu gnu find kılavuzunda belgelenmiştir. Cevabımın geri kalanında bu dosya sistemlerini görmezden geleceğim çünkü bunlar unix için tasarlanmadı ve sadece netlik eklemeden işleri karmaşıklaştırdı. Aynı nedenden ötürü kök dizini ve bağlama noktalarını da görmezden geleceğim.
Bir dizine bağlantıların sayısını asla daha az çünkü iki daha .
ve ..
. Alt dizinlerin sayısı, bağlantı sayısı eksi ikiye eşittir. Bu nedenle bağlamak veya bir dizini bağlantısını kaldırma, yani edemez rm -r
olacak stat
silme ve kullanmadan önce bir dosya rmdir
yerine unlink
dizinleri üzerinde. İki sistem çağrısı, çekirdekte tamamen farklı kod yolları kullanır.
..
her dizin içinde mevcut olan bir bir alt. ki hepsi bir tane var ama /
bir tane var, yani tüm dizinler.
..
kendisine sabit bir bağlantısı yoktur . Dir ile zor bağlantılar nelerdir? yol adına sahip dosya ve .
? (2) Bağlanma noktalarını neden görmezden geliyorsunuz?
..
üst öğeyi gösterecektir. Özel bir durum olarak kök dizin bağlantısı kendini gösterir. Bu, cd ..\..
nerede olursanız olun, benzer komutların beklendiği gibi çalışmasına izin verir . stat
Komut ile test edebilirsiniz .
..
. Bunun nedeni .
ve üst dizindeki adı işaret eden ad. Tek istisna, ebeveyni olmayan köktür. Ama kendine ..
işaret ediyor, bu yüzden de bağlantı sayısı = 2 var.
Geleneksel olarak tasarlanmış UNIX dosya sistemindeki referans sayısı (örneğin, sabit bağlantı sayısı ve açık dosya tanıtıcılarının sayısı *) 0'a ulaşan tüm dosyalar kaldırılır. Ancak, modern UNIX sistemlerinde, rmdir
sistem çağrısı boş bir dizini kaldırmak .
ve ..
tek tek kaldırmak yerine tek bir işlemle kaldırır .
Ancak tarihsel UNIX sistemlerinde bu sistem çağrısı yoktu. Bunun yerine, rmdir
komut (setuid programdı kaynak kodu burada bulunabilir ) bir dizin (özel girdileri hariç) boş olduğunu kontrol hangi ve sonra çıkarılır ..
ve .
, bu sırayla ve sonra dizinin kendisini, bütün kaldırıldı unlink
dizinlerde yalnızca root kullanımına izin verilen sistem çağrısı (dolayısıyla komutun neden setuid olduğu). Bu nedenle, bu sistemlerde, bir dizinin bağlantı sayısı .
kaldırıldıktan sonra geçici olarak 1 olur , ancak dizin üst dizinden kaldırılmadan önce 0 olur.
rm
Komut, tesadüfen, dizinleri çıkarmalarını bile kök engelledi. Ve içeriğini boşalttıktan sonra dizinleri kaldırma komutunu rm -r
çağırır rmdir
.
Bu geçmiş sistemlerde, unlink
kök olarak çalışan bir programdan gelen çağrıyı kötüye kullanmak , veya bir yarış koşulu ile rmdir
veya arasında koşmak veya mv
geçerli dizini silinmiş bir süreçte dosya oluşturmak (modern sistemler bunu engeller), dosyaların veya dizinlerin sarkmasına neden olabilir sabit bağlantı sayısı 0'ın üzerinde olan ancak dizin ağacında bulunmayan. Bu durum tarafından tespit edildi dcheck
ve fsck
çoğu dosya sisteminde fiziksel olarak mümkün kaldığı için hala kontrollerden biri .
Dosya sistemleri, bu arada, sabit bağlantıları olan normal dosyalar olarak dizinleri ( .
ve dahil ..
) uygulamak için gerekli değildir . Bu dosya sistemlerinde, bir dizinin hardlink sayısı her zaman olarak bildirilecektir 0
(ancak elbette, üst dizindeki varlığı 1 "referans sayısı" için yeterlidir).
Kaldırılan bir dizinin davranışı (örneğin, zaten açık olan veya geçerli dizini olan bir işlem tarafından incelendiğinde) ve bir dizinin "bağlantı sayısı" nın tam anlamı belirtilmez. Örneğin, Mac OS X'te, gerçek bir hardlink olmasa bile , 2 numaralı bir hardlink sayısını bildirecektir . Listede görünmesine .
ve ..
görünmemesine rağmen , dizin açılabilir ve veya stat
adıyla çağrılabilir . Linux'ta bağlantı sayısı 0'dır ve yine de çalışır..
..
.
..
Mac OS X ayrıca bir dizindeki tüm dosyaların sayısını yalnızca alt dizinlerin sayısı yerine bağlantı sayısı olarak bildirir . Ama bile 2'dir .
ve ..
gitti.
* Bu, normal açık tanımlayıcıları, bellek eşlemeli bölümleri (örn. İkili dosyaları ve paylaşılan kütüphaneleri yürütme dahil) ve geçerli dizinleri içerir.
strcpy
bir setuid çalıştırılabilir sabit boyutlu bir dizi ... bunlar iyi zamanlardı!
mkdir
Aslında aynı şeyi tersine yapmak zorunda olduğu gerçeğine dayanarak yayınlanmış bir istismar var.
rmdir
değil ..
mi?
..
yalnızca alt dizini varsa sabit bir bağlantısı vardır , değil mi? Yani..
bir dizin için her zaman mevcut değil, değil mi?