Kapan direktori berhenti dibaca sebagai file?

29

Saya memiliki edisi pertama buku The Unix Programming Environment. Dalam bab 2, penulis menyatakan bahwa direktori dapat dibaca sebagai file, dan menyebutkan beberapa fakta tentang format file-file ini. Mereka memberikan beberapa contoh penggunaan seperti cat .(dalam latihan 2-2).

Setidaknya di Darwin, direktori tidak lagi dapat dibaca sebagai file. Paling tidak, mereka tampak seperti file dengan panjang nol saat dibaca.

Kapan perubahan ini terjadi, dan adakah dokumentasi resmi tentang hal itu?

Tyler
sumber
1
Saya ingat itu bekerja beberapa waktu 1991sep-1995 Juni pada sun solaris. Saya pikir itu berhenti bekerja untuk saya di suatu tempat dalam periode waktu itu juga. Ketika kami upgrade ke mesin sparc dengan sistem V. (tidak ingat dengan baik). Mungkin tergantung pada sistem file. Jika sistem file tidak menyimpan data persis seperti yang dijelaskan maka itu akan rusak kecuali lapisan kompatibilitas ditambahkan. Juga tidak berfungsi hari ini menggunakan Debian Gnu + Linux.
ctrl-alt-delor
1
Saya tahu bahwa membaca direktori sebagai file berfungsi di bawah Unix System V pada akhir 80-an - awal 90-an. Ini bekerja di bawah SunOS. Ini bekerja di bawah beberapa versi Irix. Saya pikir pergi ke sistem file virtual dan memungkinkan banyak organisasi disk yang mendasarinya berarti Anda tidak dapat benar-benar mendukung ini secara efisien.
Bruce Ediger
8
Info lebih lanjut (non-otoritatif) dapat ditemukan di sini: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
Saya memeriksa AIX dan Solaris - memang, pada AIX Anda masih bisa cat .menggunakan Solaris 11 (seperti di Linux) Anda tidak bisa. Keren.
gena2x

Jawaban:

13

Referensi nomor kesalahan dari spesifikasi POSIX terbaru (POSIX.1-2008) menyatakan:

[EISDIR]

Apakah direktori. Upaya telah dilakukan untuk membuka direktori dengan mode tulis yang ditentukan.

Ini berarti bahwa, pada OS yang mendukung POSIX, Anda harus dapat membaca () direktori jika Anda membukanya hanya baca (O_RDONLY).

Saya baru saja mencoba ini pada kotak NetBSD (yang sangat peduli dengan POSIX), dan berfungsi seperti yang diharapkan, sementara gagal pada GNU / Linux dengan EISDIR (yang seharusnya tidak terjadi).

Pandangan cepat di Linux menunjukkan ini dimaksudkan ( 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;
}

Sementara implementasi sistem file konkret dapat menimpanya (seperti CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), perilaku default adalah mengembalikan EISDIR setiap kali seseorang mencoba untuk baca () direktori, meskipun hanya buka baca.

Saya telah melacak perubahan ini kembali ke 2.0.x, dan setidaknya untuk sistem file ext2, ini masih terjadi.

Jadi, ya, pada OS yang mendukung POSIX Anda harus dapat membaca direktori, tetapi beberapa kernel (seperti Linux dan, tampaknya, yang lain) mengabaikan kondisi ini dan melanggar standar.

Sergio L. Pascual
sumber
6
Menurut Open Group, perilaku Linux di sini sah menurut ekstensi XSI ke standar . readdir(2)lebih portabel. Itu menunjukkan kepada saya jawaban yang benar untuk pertanyaan OP adalah "Ketika XSI menjadi populer."
Kevin