Dizinler ne zaman dosya olarak okunabilir hale geldi?


29

Unix Programlama Ortamı kitabının 1. basımı var. 2. bölümde, yazarlar dizinlerin dosya olarak okunabilir olduğunu ve bu dosyaların formatı hakkında bazı gerçeklerden bahsettiğini belirtmiştir. cat .(Egzersiz 2-2) gibi bazı kullanım örnekleri verir .

En azından Darwin'de, dizinler artık dosya olarak okunamıyor. En azından okunduğunda sıfır uzunlukta dosyalar gibi görünüyorlar.

Bu değişiklik ne zaman oldu ve bu konuda resmi bir belge var mı?


1
1991sep-1995'teki güneş solarileri üzerinde çalıştığını hatırlıyorum. Sanırım o zaman diliminde de benim için çalışmayı bıraktı. Sistem V ile sparc makinelere yükseltme yaptığımızda (iyi hatırlayamıyorum). Muhtemelen dosya sistemine bağlıdır. Dosya sistemi verileri tam olarak tanımlandığı şekilde saklamazsa, bir uyumluluk katmanı eklenmeden bozulur. Ayrıca bugün Debian Gnu + Linux kullanarak çalışmıyor.
ctrl-alt-delor

1
Bir dizini bir dosya olarak okumanın, 80'lerin sonunda - 90'ların başında Unix System V altında çalıştığını biliyorum. SunOS altında çalıştı. Irix'in bazı versiyonlarında çalıştı. Sanal dosya sistemine geçmenin ve birçok temel disk organizasyonuna izin vermenin, bunu gerçekten verimli bir şekilde destekleyemeyeceğiniz anlamına geldiğini düşünüyorum.
Bruce Ediger

8
Daha fazla bilgi (yetkili olmayan) bilgi burada bulunabilir: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh

AIX ve Solaris'i kontrol ettim - aslında, AIX üzerinde hala cat .Solaris 11'de (Linux'ta olduğu gibi) yapamazsınız. Güzel.
gena2x

Yanıtlar:


13

En son POSIX şartnamesinden (POSIX.1-2008) yapılan hata numarası referansı şöyledir:

[EISDIR]

Bir dizin var. Yazma modu belirtilen bir dizini açma denemesi yapıldı.

Bu, POSIX uyumlu bir işletim sisteminde, yalnızca okumayı açtıysanız bir dizini okuyabilmeniz gerektiği anlamına gelir (O_RDONLY).

Bunu henüz bir NetBSD (POSIX'i gerçekten önemseyen) kutusunda denedim ve beklendiği gibi çalışıyor, GNU / Linux'ta EISDIR'le (olmamalıydı) başarısız oldu.

Linux'a kısa bir bakış, bunun amaçlandığını gösterir ( http://lxr.free-electrons.com/source/fs/libfs.c#L189 ):

ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
{
        return -EISDIR;
}

Somut bir dosya sistemi uygulaması bunu geçersiz kılabilirken ( CEPH'in yaptığı gibi: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), varsayılan davranış, birisi ne zaman çalışıyorsa, EISDIR’ı geri döndürmektir. Bir dizini oku (), açık olsa bile oku.

Bu değişikliği tekrar 2.0.x'e kadar izledim ve en azından ext2 dosya sistemi için bu hala geçerliydi.

Bu yüzden, evet, POSIX uyumlu bir işletim sisteminde bir dizini okuyabilmelisiniz, ancak bazı çekirdekler (Linux gibi, görünüşe göre diğerleri) bu durumu görmezden gelir ve standardı bozar.


6
Open Group’a göre, Linux’un buradaki davranışı , standardın XSI uzantısı altında yasal . readdir(2)daha taşınabilir. Bu da OP'nin sorusuna doğru cevabı "XSI popüler olduğunda" olduğunu gösteriyor.
Kevin
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.