Sabit bağlantı sayısı 0 olduğunda dizin kaldırılır mı?


10

Sabit bağlantı sayısı 0 olduğunda dizin kaldırılır mı?

Bir dizin nedeniyle sabit bağlantı sayısı her zaman en az 2 olur .. Bir rm -rdizin olduğunda , sabit bağlantı sayısını 1 yerine 2'den 0'a düşürür mü?

Bir dizinin sabit bağlantı sayısı 1 olabilir mi?

Teşekkürler.

Yanıtlar:


9

Ö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 -rolacak statsilme ve kullanmadan önce bir dosya rmdiryerine unlinkdizinleri üzerinde. İki sistem çağrısı, çekirdekte tamamen farklı kod yolları kullanır.


Teşekkürler. Bir dizinin ..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?
Tim

..her dizin içinde mevcut olan bir bir alt. ki hepsi bir tane var ama /bir tane var, yani tüm dizinler.
Hildred

1
(1) Bir dizinin alt dizini yoksa, dizinin ..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?
Tim

Dizin bir alt dizinse. giriş ..ü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 . statKomut ile test edebilirsiniz .
BillThor

1
Bağlantı sayısının asla 2'den az olmadığı doğru, ancak bunun nedeni değil ... 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.
Barmar

11

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, rmdirsistem ç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ı unlinkdizinlerde 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.

rmKomut, 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, unlinkkök olarak çalışan bir programdan gelen çağrıyı kötüye kullanmak , veya bir yarış koşulu ile rmdirveya arasında koşmak veya mvgeç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 dcheckve 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 statadı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.


2
strcpybir setuid çalıştırılabilir sabit boyutlu bir dizi ... bunlar iyi zamanlardı!
Andrea Corbellini

@AndreaCorbellini mkdirAslında aynı şeyi tersine yapmak zorunda olduğu gerçeğine dayanarak yayınlanmış bir istismar var.
Random832


hakkında soran , üst dizin kaldırmak rmdirdeğil ..mi?
Edward Torvalds

@ edwardtorvalds Hayır, işaret ettiği üst dizinin değil, ".." bağlantısının kendisinin kaldırılmasını kastediyordum.
Random832
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.