Neden kedi / dev yapabilirim?


Yanıtlar:


43

Tarihsel olarak (V7 UNIX'e veya 1979'a kadar) readsistem çağrısı hem dosyalar hem de dizinler üzerinde çalıştı. readBir dizinde, bir kullanıcı programının dizin girişlerini elde etmek için ayrıştırdığı basit bir veri yapısı döndürülürdü. Nitekim, V7 lsaracı tam olarak bunu yaptı - readbir dizinde, elde edilen veri yapısını çözümlemek, yapılandırılmış liste biçiminde çıktı almak.

Dosya sistemleri daha karmaşık hale geldikçe, bu "basit" veri yapısı, readdirprogramların çıktılarını ayrıştırmasına yardımcı olmak için bir kütüphane işlevinin eklendiği noktaya gelince daha da karmaşıklaştı read(directory). Farklı sistemler ve dosya sistemleri karmaşık hale gelen farklı disk formatlarında olabilir.

Sun, Ağ Dosya Sistemi'ni (NFS) tanıttığında, diskteki dizin yapısını tamamen soyutlamak istediler. read(directory)Bununla birlikte, geri dönüşlerini dizinin platformdan bağımsız bir gösterimi yapmak yerine, yeni bir sistem çağrısı eklediler - getdirents- ve readağa bağlı dizinleri yasakladılar . Bu sistem çağrısı, çeşitli UNIX lezzetlerinde tüm dizinlerde çalışmak üzere hızlı bir şekilde adapte edildi ve bu, dizinlerin içeriğini almanın varsayılan yolunu yaptı. (Tarih https://utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory adresinden çıkarıldı )

Çünkü readdirartık dizinleri okumak için varsayılan yöntemdir, read(directory)genellikle en modern işletim sistemleri üzerinde (dönen -EISDIR) uygulanmadı (QNX, örneğin, kayda değer bir istisna uygular olduğu readdirkadar read(directory)). Bununla birlikte, çoğu modern çekirdekteki "sanal dosya sistemi" tasarımıyla, bir dizini okumanın işe yarayıp yaramadığı tek tek dosya sistemine bağlıdır.

Gerçekten de, macOS'ta, bağlama noktasının devfsaltındaki dosya sistemi /devokumayı gerçekten destekliyor ( https://github.com/apple/darwin-xnu/blob/xnu-4570.1.46/bsd/miscfs/devfs/devfs_vnops.c#L629 ) :

static int
devfs_read(struct vnop_read_args *ap)
{
        devnode_t * dn_p = VTODN(ap->a_vp);

    switch (ap->a_vp->v_type) {
      case VDIR: {
          dn_p->dn_access = 1;

          return VNOP_READDIR(ap->a_vp, ap->a_uio, 0, NULL, NULL, ap->a_context);

Bu READDIR, okumaya çalışırsanız açıkça çağırır /dev(altındaki dosyaları okumak /devayrı bir işlev tarafından ele alınır devfsspec_read). Böylece, bir program readsistem çağrısını çağırırsa, /devbaşarılı olur ve bir dizin listesi alır!

Bu, UNIX'in ilk günlerinden kalma ve çok uzun zamandır dokunulmamış bir özelliktir. Bir kısmım bunun geriye dönük uyumluluk nedeniyle çevrede tutulduğundan şüpheleniyor, ancak hiç kimsenin gerçekten hiçbir şeyi incitmeyeceği için özelliği kaldırmak için yeterince umursamadığı gerçeği olabilir.


Muhtemelen ikincisi, çoğu dizinden kaldırılmış olduğunu görün.
user253751

36

Daha az bir metin dosyası görüntüleyicisidir, kedi isteğe bağlı verileri kopyalamak için bir araçtır. Bu yüzden, daha az miktarda veriye sahip olan veya çok garip davranan bir şeyi açmadığınızdan emin olmak için daha az kendi denetimini yapar. Öte yandan, kedinin böyle bir kontrolü yoktur - çekirdek bir şeyi açmanıza izin verirse (bir boru veya cihaz veya daha kötü bir şey olsa bile), kedi okuyacaktır.

Peki neden işletim sistemi kedinin dizin açmasına izin veriyor ? Geleneksel olarak BSD tarzı sistemlerde tüm dizinler dosya olarak okunabiliyordu ve programlar ilk başta bir dizini böyle listeliyordu: sadece diskte depolanan dirent yapılarını yorumlayarak.

Daha sonra, bu diskteki yapılar çekirdek tarafından kullanılan dizinden ayrılmaya başladı: daha önce bir dizinin doğrusal bir liste olduğu, daha sonra dosya sistemlerinin karekter, B-ağaçları vb. Bu nedenle, dizinleri doğrudan okumak artık kolay değildi - çekirdek bunun için özel işlevler geliştirdi. (Asıl nedenin bu olup olmadığından veya önbellekleme gibi diğer nedenlerden dolayı eklendiklerinden emin değilim.)

Bazı BSD sistemleri, tüm dizinleri okumak için açmanıza izin verir; Size ham verileri diskten mi verip vermediklerini veya bunun yerine öykünmüş bir yönetim listesi döndürüp döndürmediklerini veya dosya sistemi sürücüsünün karar vermesine izin verip vermediklerini bilmiyorum.

Bu yüzden belki de macOS, dosya sistemi veri sağladığı sürece çekirdeğin izin verdiği işletim sistemlerinden biridir . Ve fark olduğunu /devbir açık devfsiken, ilk günlerinde Buna izin vermek yazılmıştır dosya sistemi /modern zamanlarda gereksiz olarak bu özelliği ihmal bir APFS dosya sisteminde.

Yasal Uyarı: Aslında BSD'ler veya macOS hakkında herhangi bir araştırma yapmadım. Sadece onu kanatlıyorum.


Bu mantıklı görünüyor. Standart işletim sistemi dosya sisteminden farklı başka depolama bölümleri var mı? Varsaydım /etc, bu yüzden bunu benim ölçütüm olarak kullandım.
haboutnnah

2
Aksine, genellikle / etc sadece normal dosyalar içeren normal bir klasördür. Orada olabilir vadede - diğer sanal dosya sistemleri olsa olması mountveya /sbin/mountşu anda nerede monte neler olduğunu görmek için.
Grawity

Haklısın! Şuna
haboutnnah

Bu gerçekten temiz @grawity, i.imgur.com/8QuR0FK.png
haboutnnah

6
Ekran görüntüleriniz onaylar @haboutnnah /devkullanarak sanal bir dosya sistemidir devfsoysa sürücüyü /etcparçasıdır /kullanarak dosya sistemi apfssürücüsü. Öyleyse sebep catbirini okuyacak, diğeri okuyacak apfsve devfssürücüler arasındaki fark .
kasperd
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.