เมื่อใดที่ไดเรกทอรีหยุดอ่านเป็นไฟล์ได้


29

ฉันมีหนังสือ The Unix Programming Environment รุ่นที่ 1 ในบทที่ 2 ผู้เขียนระบุว่าไดเรกทอรีสามารถอ่านได้เป็นไฟล์และพูดถึงข้อเท็จจริงบางอย่างเกี่ยวกับรูปแบบของไฟล์เหล่านี้ พวกเขาให้ตัวอย่างการใช้งานบางอย่างเช่นcat .(ในแบบฝึกหัด 2-2)

อย่างน้อยในดาร์วินไดเรกทอรีจะไม่สามารถอ่านเป็นไฟล์ได้อีกต่อไป อย่างน้อยไฟล์เหล่านั้นดูเหมือนจะเป็นศูนย์ความยาวเมื่ออ่าน

การเปลี่ยนแปลงนี้เกิดขึ้นเมื่อใดและมีเอกสารอย่างเป็นทางการเกี่ยวกับเรื่องนี้หรือไม่?


1
ฉันจำได้ว่ามันใช้งานได้ในช่วงปี 1991sep-1995 จุนบนโซลาร์ซัน ฉันคิดว่ามันหยุดทำงานสำหรับฉันที่ไหนสักแห่งในช่วงเวลานั้นเช่นกัน เมื่อเราอัพเกรดเป็นเครื่อง sparc ด้วยระบบ V. (จำไม่ได้ให้ดี) มันอาจขึ้นอยู่กับระบบไฟล์ หากระบบไฟล์ไม่ได้จัดเก็บข้อมูลตรงตามที่อธิบายไว้แล้วมันจะแตกเว้นแต่ชั้นความเข้ากันได้จะถูกเพิ่ม ยังไม่สามารถใช้งานได้ในวันนี้ด้วย Debian Gnu + Linux
ctrl-alt-delor

1
ฉันรู้ว่าการอ่านไดเรกทอรีเป็นไฟล์ทำงานภายใต้ Unix System V ในช่วงปลายยุค 80 - ต้นยุค 90 มันทำงานภายใต้ SunOS มันทำงานภายใต้ Irix บางรุ่น ฉันคิดว่าการไปที่ระบบไฟล์เสมือนและการอนุญาตให้องค์กรดิสก์หลาย ๆ แห่งหมายความว่าคุณไม่สามารถสนับสนุนสิ่งนี้ได้อย่างมีประสิทธิภาพ
Bruce Ediger

8
ข้อมูลเพิ่มเติม (ไม่มีสิทธิ์) สามารถพบได้ที่นี่: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh

ฉันตรวจสอบบน AIX และ Solaris - แน่นอนบน AIX คุณยังสามารถอยู่cat .บน Solaris 11 (เช่นเดียวกับ Linux) ที่คุณไม่สามารถทำได้ เย็น.
gena2x

คำตอบ:


13

หมายเลขข้อผิดพลาดอ้างอิงจากข้อมูลจำเพาะ POSIX ล่าสุด (POSIX.1-2008):

[EISDIR]

เป็นไดเรกทอรี มีความพยายามในการเปิดไดเรกทอรีโดยระบุโหมดการเขียน

ซึ่งหมายความว่าในระบบปฏิบัติการที่สอดคล้องกับ POSIX คุณควรจะสามารถอ่าน () ไดเรกทอรีถ้าคุณเปิดอ่านอย่างเดียว (O_RDONLY)

ฉันเพิ่งลองใช้งาน NetBSD (ซึ่งกังวลกับ POSIX) มากและทำงานได้ตามที่คาดหวังในขณะที่มันล้มเหลวบน GNU / Linux ด้วย EISDIR (ซึ่งไม่ควรเกิดขึ้น)

ดูอย่างรวดเร็วที่ Linux แสดงสิ่งนี้มีไว้ ( 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;
}

ในขณะที่การใช้งานระบบไฟล์ที่เป็นรูปธรรมสามารถแทนที่มัน (เช่น CEPH ทำ: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ) พฤติกรรมเริ่มต้นคือการกลับ EISDIR เมื่อมีคนพยายามที่จะ อ่าน () ไดเรกทอรีแม้ว่าจะเปิดอ่านอย่างเดียว

ฉันได้ติดตามการเปลี่ยนแปลงนี้กลับไปที่ 2.0.x และอย่างน้อยสำหรับระบบไฟล์ ext2 นี่ก็ยังคงเป็นเช่นนั้น

ดังนั้นใช่ในระบบปฏิบัติการที่ใช้ POSIX ได้คุณควรจะสามารถอ่านไดเร็กตอรี่ได้ แต่เมล็ดบางตัว (เช่น Linux และอื่น ๆ ) จะมองข้ามเงื่อนไขนี้และทำลายมาตรฐาน


6
ตามที่กลุ่มเปิดพฤติกรรมลินุกซ์ที่นี่เป็นกฎหมายภายใต้การขยาย XSI มาตรฐาน readdir(2)พกพาได้มากกว่า ที่แนะนำให้ฉันคำตอบที่ถูกต้องสำหรับคำถามของ OP คือ "เมื่อ XSI กลายเป็นที่นิยม"
เควิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.