Bir dizin “özel bir dosya tipi” nasıldır?


Yanıtlar:


19

* 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 .


2
POSIX.1-2008 sistem çağrıları (bir demet eklendi openat, fstatatvs.) dizinlere atıfta dosya tanımlayıcıları kullanırız.
zwol

2
Daha da ilginç 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.
Kevin

13

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:

  • bağlantılar
  • prizler
  • cihazlar

Ancak "dosyalar" olarak kabul edildiklerinden, lsonları yeniden adlandırabilir ve yeniden adlandırabilir ve taşıyabilir ve özel dosya türüne bağlı olarak bunlara veri gönderebilirsiniz.


1
Bu da hayatı çok kolaylaştırıyor, çünkü farklı bir şey yapmak zorunda değilsiniz çünkü o bir dizin. Bu, program yazmanın yanı sıra komut satırından (veya GUI) işlemler için de geçerlidir.
gbarry

1
Bir dizin veri içerir: dizinde bulunan dosyaları tanımlayan veri. Bir dizine (belki de standart bir açık aramayla olmasa da) erişmek ve bu verileri kendiniz okumak için mükemmel bir şekilde mümkün (Bruce Ediger'ın cevabında da belirttiği gibi) formatı bilmediğiniz sürece verilerin çok fazla kullanılmaması.
jamesqf

11

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/includedoğ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.



1
Bir dizini hala açıp bugün bazı Unix varyantlarında dosya olarak okuyabilirsiniz, örneğin FreeBSD 10.1'de hala mümkündür. (Yapmalı mı?)
Gilles 'çok kötü olmayı'

@Gilles Kullanılabilirlik konusunda emin olmasam da, dd tarafından kopyalanan bir dizinin esas olarak eşdeğer olması halinde çok mantıklı olacağını düşünüyorum cp --link dir1/* dir2.
peterh, Monica

3

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.


İşler tüm dosya sistemlerinde o kadar basit değildir - örneğin, Apple HFS + 'sında doğru hatırlıyorsam tüm yol adlarını içeren sadece bir büyük B + ağacı var - ancak bu gözlem BSD'nin ffs'leri dahil olmak üzere Unix dosya sistemlerinde dikkat çekiyor. Atıf yapılan eğitimin yazarlarının düşündüğü şey muhtemelen budur.
zwol

2

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.


-3

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ı.


2
Hayır, sadece 1 inode aynı dosyayı gösterebilir. Her ne kadar aynı inode birden fazla dizinde (veya birden fazla isimlerde) aynı anda bulunabilir. Kolay bir kontrol: 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.
peterh, Monica

@peterh Dosya tanımlayıcıları yalnızca bir işlem için benzersizdir. açıklayabilir misin?
alamin

1
@ Md.AlaminMahamud Bir süreç fork()s ise, alt sürecinin O_CLOEXECorijinal 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).
peterh Monica

1
@ Md.AlaminMahamud Pekala, şimdi pek emin değilim, örneğin bir 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.
peterh Monica
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.