Bu Unix dersini okuyorum ve bu alıntıya rastladım ...
Burada bir dizinin yalnızca özel bir dosya türü olduğunu not etmeliyiz.
... ancak hiçbir açıklama veya ayrıntı verilmemiştir. Bir dizin gerçekten sadece bir dosya nasıl?
Bu Unix dersini okuyorum ve bu alıntıya rastladım ...
Burada bir dizinin yalnızca özel bir dosya türü olduğunu not etmeliyiz.
... ancak hiçbir açıklama veya ayrıntı verilmemiştir. Bir dizin gerçekten sadece bir dosya nasıl?
Yanıtlar:
* Nix tarzı (ve diğer) işletim sistemlerindeki birçok varlık, dosya sisteminde kabul edilir veya zorunlu olarak bir dosya sisteminde depolanan bir bayt dizisi olmasalar bile, tanımlayıcı bir dosya benzeri özelliğe sahiptir. Tam olarak dizinlerin nasıl uygulandığı, dosya sisteminin türüne bağlıdır, ancak genellikle içerdikleri, bir liste olarak kabul edilen bir depolanmış bayt dizisidir, bu yüzden o anlamda özel değildir.
Bir "dosya" nın bir * nix bağlamında ne olduğunu tanımlamanın bir yolu, onunla ilişkilendirilmiş bir dosya tanıtıcısına sahip bir şey olmasıdır. Wikipedia makalesine göre, bir dosya tanıtıcısı
boru veya ağ bağlantısı gibi bir dosyaya veya diğer giriş / çıkış kaynaklarına erişmek için kullanılan soyut bir göstergedir ...
Başka bir deyişle, bu dizinin kaynağı / hedefi belirtilmemiş olmasına rağmen, bir bayt dizisinin okunabileceği / yazılabileceği çeşitli kaynaklara atıfta bulunurlar. Başka bir deyişle, kaynağın "nerede" herhangi bir şey olabilir. Bunu tanımlayan şey onun bir bilgi hattı olduğudur. Bu, bazen unix'te "her şeyin bir dosya" olduğu söylenmesinin bir parçasıdır. Bunu tam anlamıyla anlamamalısın, ama ciddi bir değerlendirmeye değer. Bir dizinde, bu bilgi dizinde ne olduğuna ve daha düşük bir uygulama seviyesinde dosya sisteminde nasıl bulunacağına ilişkindir.
Dizinler bu anlamda özeldir, çünkü yerel C kodunda görünüşte bir dosya tanıtıcısıyla ilişkilendirilmezler; POSIX API, özel bir tür akış tanıtıcısı kullanır DIR*
. Bununla birlikte, bu tip gerçekte alınabilen temel bir tanımlayıcıya sahiptir . Tanımlayıcılar çekirdek tarafından yönetilir ve bunlara erişmek her zaman sistem çağrıları içerir, bu nedenle tanımlayıcının ne olduğu başka bir yönü de OS çekirdeği tarafından kontrol edilen bir kanal olmasıdır. Standart giriş akışı için genellikle tanımlayıcı olan 0 ile başlayan benzersiz (işlem başına) sayıları vardır .
openat
, fstatat
vs.) dizinlere atıfta dosya tanımlayıcıları kullanırız.
fsync()
olanı, bir salt okunur (!) Dizini fd olabilir ve iyi tanımlanmış bir etkiye sahiptir (özellikle, verilen dizindeki dosya oluşturma / yeniden adlandırma / silme işlemlerini, diske yazma, teorik olarak gerekli olan "yazma" komutunu kullanır. geçici bir dosyaya yerleştirin ve orijinal "deyim" yerine yeniden adlandırın.
Unix İş Yapma Yolu: Her şey bir dosyadır.
Bir dizin (çoğu) özel dosya türünden biridir. Veri içermiyor. Bunun yerine, dizinde bulunan tüm dosyaların işaretleyicilerini içerir.
Diğer özel dosya türleri:
Ancak "dosyalar" olarak kabul edildiklerinden, ls
onları yeniden adlandırabilir ve yeniden adlandırabilir ve taşıyabilir ve özel dosya türüne bağlı olarak bunlara veri gönderebilirsiniz.
Benim cevabım sadece hatırlamadır, fakat 199x vintage Unix'lerde, birçokları vardı, dizinler sadece diskteki inode içinde bir yerde "dizin" olarak işaretlenmiş dosyalardır.
Bir şeye benzer bir dizini açabilir open(".", O_RDONLY)
ve kullanılabilir bir dosya tanımlayıcısını geri alabilirsiniz. Eğer içeri /usr/include
doğru gezinirseniz ve doğru C yapı tanımını bulursanız, içeriği çözümleyebilirsiniz . Bunu SunOS 4.1.x sistemleri, SGI'nin EFS dosya sistemi ve DEC'in Mips-CPU iş istasyonlarının muhtemelen BSD4.2 FFS dosya sistemi için ne yaptığını biliyorum.
Kötü bir deneyimdi. Sanal dosya sistemi katmanında standardizasyon, dizinler artık katı dosyalar olmasa bile taşınabilirlik için iyi bir şeydir. VFS katmanları, ReiserFS veya NFS gibi dizinlerin dosya olmadığı dosya sistemlerini denememize izin verir.
cp --link dir1/* dir2
.
Bir dizin kendi modunda 'd' ye sahip olması özeldir, dosya sistemine içeriğini, sadece bir bayt dizisi olan normal bir dosya yerine dizinde bulunan diğer dosyaların bir listesi olarak yorumlaması gerektiğini söyler. uygulama tarafından okunur. Hepsi bu.
Dizinler dosyalardır çünkü linux sistemleri evrensel g / Ç modeli kullanır . Modelde sistemdeki her şey bir dosyadır ve aynı sistem çağrıları ve çeşitli komutlarla erişilebilir.
Bunlar özel tiptedir çünkü i-düğümleri dosya tipi için işarete sahiptir ve bir dosya isimleri tablosu ve diğer i-düğümlere bağlantı olma özel bir yapısına sahiptirler. Bir yönetmenin i-düğümündeki "hardlinks" olarak da bilinen bu dosya adı-link çiftleri, dizinin içerisindeki dosyaları numaralandırır.
Dizinler sadece dosyaları düzenlemek içindir. Bir dosya bir dizinden diğerine "taşındığında", dosyanın kendisi diskte taşınmaz. Sadece bir i-node dizinindeki bir giriş kaldırılır ve başka bir i-node dizine yazılır.
Kabul edilen cevap tamamen doğru değil. POSIX sistemlerinde "Inodes", dosyalara ve dizinlere işaret eder. Dosya Tanımlayıcıları yalnızca bir süreç için benzersizdir ve bir sistem genelinde değildir. Ancak inode'lar benzersizdir, ancak birden fazla inode tek bir dosyaya işaret edebilir. Kabul edilen cevap hakkında yorumda bulunacaktı ancak temsilci yasağının kısıtlanmasından dolayı olamazdı.
ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txt
. Göreceksiniz ki, bu sabit linkler aynı inode numarasına sahip.
fork()
s ise, alt sürecinin O_CLOEXEC
orijinal süreçle aynı dosya sağlayıcı varlıklarının (bazı özel durumlar, bir bayrak hariç ) tam olarak aynı olacağı doğru değildir. Başka bir örnek: apache alt işlemleri listen()
aynı soket dosya tanımlayıcısında işlemektedir. Ancak bu cevap, bir çekirdek iç veri yapısı olan ve sadece çekirdek bellekte bulunan dosya tanımlayıcıları ile ilgili değildir. Bu ( yanlış ) cevap, dizin girişleri ve inode'larla ilgilidir, bunlar disk üstü varlıklardır (yani, sabit sürücüdeki fiziksel baytlardır).
fork()
olay meydana gelirse ve o zaman alt işlem seek()
veya süreçler close()
ebeveynin dosya tanımlayıcısını etkilemez. Bu yüzden şimdi düşünüyorum ki, dosya tanımlayıcıları sadece kısmen süreç-özel yapılardır. Ancak bu soru onlar hakkında değil, bu soru direktörler / inode'lar hakkında ve ben sizi bu soruya tamamen yanlış bir cevap olarak yorumluyorum.