Yapabilirim cat /dev
, yapabilirim ls /dev
, yapamam less /dev
. Neden bu dizini cat
bana izin veriyor cat
ama başka dizin yok?
Yapabilirim cat /dev
, yapabilirim ls /dev
, yapamam less /dev
. Neden bu dizini cat
bana izin veriyor cat
ama başka dizin yok?
Yanıtlar:
Tarihsel olarak (V7 UNIX'e veya 1979'a kadar) read
sistem çağrısı hem dosyalar hem de dizinler üzerinde çalıştı. read
Bir 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 ls
aracı tam olarak bunu yaptı - read
bir 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ı, readdir
programları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 read
ağ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ü readdir
artı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 readdir
kadar 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 devfs
altındaki dosya sistemi /dev
okumayı 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 /dev
ayrı bir işlev tarafından ele alınır devfsspec_read
). Böylece, bir program read
sistem çağrısını çağırırsa, /dev
baş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.
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 /dev
bir açık devfs
iken, 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.
/etc
, bu yüzden bunu benim ölçütüm olarak kullandım.
mount
veya /sbin/mount
şu anda nerede monte neler olduğunu görmek için.
/dev
kullanarak sanal bir dosya sistemidir devfs
oysa sürücüyü /etc
parçasıdır /
kullanarak dosya sistemi apfs
sürücüsü. Öyleyse sebep cat
birini okuyacak, diğeri okuyacak apfs
ve devfs
sürücüler arasındaki fark .
neofetch
bilgi için :) i.imgur.com/3azpnDt.png