ไดเร็กทอรีเป็น“ ไฟล์ชนิดพิเศษ” อย่างไร?


23

ฉันกำลังอ่านบทช่วยสอน Unix นี้และพบข้อความอ้างอิงนี้

เราควรทราบไว้ที่นี่ว่าไดเรกทอรีเป็นเพียงไฟล์ชนิดพิเศษ

... แต่ไม่มีคำอธิบายหรือรายละเอียดใด ๆ ไดเรกทอรีเป็นเพียงไฟล์ได้อย่างไร?


1
ที่เกี่ยวข้อง: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
zwol

คำตอบ:


19

เอนทิตีหลายแห่งในระบบปฏิบัติการสไตล์ * nix (และอื่น ๆ ) ได้รับการพิจารณาว่าเป็นไฟล์หรือมีลักษณะเหมือนไฟล์ที่กำหนดแม้ว่าพวกเขาจะไม่จำเป็นต้องเรียงลำดับไบต์ที่เก็บไว้ในระบบไฟล์ วิธีการนำไดเรกทอรีไปใช้นั้นขึ้นอยู่กับชนิดของระบบแฟ้ม แต่โดยทั่วไปแล้วสิ่งที่มีอยู่ในรายการถือว่าเป็นลำดับของไบต์ที่เก็บไว้ดังนั้นในแง่นั้นพวกเขาไม่ได้พิเศษ

วิธีหนึ่งในการกำหนดว่า "ไฟล์" นั้นอยู่ในบริบท * nix คือมันเป็นสิ่งที่มีตัวอธิบายไฟล์ที่เกี่ยวข้อง ตามบทความของวิกิพีเดียอธิบายไฟล์

เป็นตัวบ่งชี้เชิงนามธรรมที่ใช้ในการเข้าถึงไฟล์หรือทรัพยากรอินพุต / เอาท์พุตอื่น ๆเช่นการเชื่อมต่อไพพ์หรือเครือข่าย ...

กล่าวอีกนัยหนึ่งพวกเขาอ้างถึงทรัพยากรประเภทต่าง ๆ จาก / ที่ลำดับของไบต์อาจอ่าน / เขียนแม้ว่าแหล่งที่มา / ปลายทางของลำดับนั้นจะไม่ได้ระบุ กล่าวอีกนัยหนึ่งว่า "ที่ไหน" ของทรัพยากรอาจเป็นอะไรก็ได้ สิ่งที่กำหนดว่ามันคือสื่อกลางของข้อมูล นี่เป็นส่วนหนึ่งของสาเหตุที่บางครั้งมีการกล่าวว่าในยูนิกซ์ "ทุกอย่างเป็นไฟล์" คุณไม่ควรใช้สิ่งนี้อย่างแท้จริง แต่ควรพิจารณาอย่างจริงจัง ในกรณีของไดเรกทอรีข้อมูลนี้เกี่ยวข้องกับสิ่งที่อยู่ในไดเรกทอรีและในระดับที่ต่ำกว่าการนำไปใช้งานวิธีค้นหาภายในระบบแฟ้ม

ไดเรกทอรีมีลักษณะพิเศษในแง่นี้เพราะในรหัสภาษา C พวกมันไม่เกี่ยวข้องกับตัวให้คำอธิบายไฟล์อย่างชัดเจน POSIX API DIR*ใช้ชนิดพิเศษที่จับกระแส แต่ประเภทนี้ไม่ในความเป็นจริงมีคำอธิบายถึงพื้นฐานซึ่งสามารถเรียกดูได้ Descriptors ได้รับการจัดการโดยเคอร์เนลและการเข้าถึงพวกเขามักจะเกี่ยวข้องกับการเรียกระบบดังนั้นด้านอื่น ๆ ของสิ่งที่อธิบายคือมันเป็นท่อควบคุมโดยเคอร์เนลระบบปฏิบัติการ พวกเขามีหมายเลขที่ไม่ซ้ำกัน (ต่อกระบวนการ) เริ่มต้นด้วย 0 ซึ่งโดยปกติจะเป็นตัวบ่งชี้สำหรับ สตรีมอินพุตมาตรฐาน


2
POSIX.1-2008 เพิ่มพวงของสายระบบ (กopenat, fstatatฯลฯ ) ซึ่งใช้อธิบายไฟล์หมายถึงไดเรกทอรี
zwol

2
สิ่งที่น่าสนใจยิ่งกว่านั้นคือคุณสามารถfsync()ไดเรกทอรีอ่านอย่างเดียว (!) fd และมีเอฟเฟกต์ที่กำหนดไว้อย่างชัดเจน (โดยเฉพาะมันซิงค์การสร้างไฟล์ / เปลี่ยนชื่อ / ลบในไดเรกทอรีที่กำหนดไปยังดิสก์ซึ่งเป็นขั้นตอนที่จำเป็น เป็นไฟล์ชั่วคราวและเปลี่ยนชื่อเป็น "สำนวนดั้งเดิม"
เควิน

13

ใน Unix Way of Doing Things: ทุกอย่างเป็นไฟล์

ไดเรกทอรีคือไฟล์พิเศษชนิดหนึ่ง (จากมาก) ไม่มีข้อมูล แต่จะมีตัวชี้ไปยังไฟล์ทั้งหมดที่อยู่ในไดเรกทอรี

ไฟล์พิเศษประเภทอื่น ๆ :

  • การเชื่อมโยง
  • ซ็อกเก็ต
  • อุปกรณ์

แต่เนื่องจากพวกเขาถูกพิจารณาว่าเป็น "ไฟล์" คุณสามารถlsเปลี่ยนชื่อและย้ายพวกมันและขึ้นอยู่กับประเภทของไฟล์พิเศษส่งข้อมูลไปยัง / จากพวกเขา


1
และสิ่งนี้ทำให้ชีวิตง่ายขึ้นมากเพราะคุณไม่ต้องทำอะไรที่แตกต่างเพียงเพราะมันเป็นไดเรกทอรี สิ่งนี้ใช้กับการเขียนโปรแกรมเช่นเดียวกับการดำเนินการจากบรรทัดคำสั่ง (หรือ GUI)
gbarry

1
ไดเรกทอรีประกอบด้วยข้อมูล: ข้อมูลที่อธิบายถึงไฟล์ที่มีอยู่ในไดเรกทอรี เป็นไปได้อย่างสมบูรณ์ในการเข้าถึงไดเรกทอรี (แม้ว่าอาจจะไม่ได้ใช้การโทรแบบเปิดมาตรฐาน) และอ่านข้อมูลนั้นด้วยตัวเอง แต่ (อย่างที่ Bruce Ediger จดบันทึกไว้ในคำตอบของเขา) การใช้ข้อมูลนั้นไม่ค่อยมีอะไรมากนัก
jamesqf

11

คำตอบของฉันคือการระลึกเพียงอย่างเดียว แต่ใน Unixes วินเทจ 199x ซึ่งมีจำนวนมากไดเรกทอรีเป็นไฟล์เพียงแค่ทำเครื่องหมาย "ไดเรกทอรี" ที่ไหนสักแห่งใน inode บนดิสก์

คุณสามารถเปิดไดเร็กตอรี่ด้วยสิ่งที่ชอบopen(".", O_RDONLY)และกลับมาเป็นไฟล์ descriptor ที่ใช้งานได้ คุณสามารถวิเคราะห์เนื้อหาได้หากคุณตรวจสอบ/usr/includeและพบคำนิยาม C struct ที่ถูกต้อง ฉันรู้ว่าฉันทำสิ่งนี้สำหรับระบบ SunOS 4.1.x, ระบบไฟล์ EFS ของ SGI และเวิร์กสเตชัน Mips-CPU ของ DEC ใดก็ตามที่มีสำหรับระบบไฟล์อาจเป็น BSD4.2 FFS

นั่นเป็นประสบการณ์ที่ไม่ดี การทำให้เป็นมาตรฐานบนเลเยอร์ระบบไฟล์เสมือนเป็นสิ่งที่ดีสำหรับการพกพาแม้ว่าไดเรกทอรีจะไม่มีไฟล์ที่เข้มงวดอีกต่อไป เลเยอร์ VFS ให้เราทดลองกับระบบไฟล์ที่ไดเรกทอรีไม่ใช่ไฟล์เช่น ReiserFS หรือ NFS



1
คุณยังสามารถเปิดไดเรกทอรีและอ่านเป็นไฟล์ใน Unix บางรุ่นได้ในวันนี้ตัวอย่างเช่นยังคงเป็นไปได้ใน FreeBSD 10.1 (ควร) ควร)
Gilles 'หยุดความชั่วร้าย'

@Gilles ฉันคิดว่ามันจะมีเหตุผลมากถ้าไดเรกทอรีที่คัดลอกโดย dd นั้นเป็นสิ่งที่เทียบเท่าcp --link dir1/* dir2แม้ว่าฉันจะไม่แน่ใจเกี่ยวกับการใช้งานของมัน
peterh กล่าวว่าคืนสถานะโมนิก้า

3

ไดเรกทอรีเป็นพิเศษในการที่มันมี 'd' ในโหมดของมันบอกระบบไฟล์ว่ามันควรตีความเนื้อหาของมันเป็นรายการของไฟล์อื่น ๆ ที่มีอยู่ในไดเรกทอรีมากกว่าไฟล์ปกติที่เป็นเพียงลำดับของไบต์ที่จะ อ่านโดยแอปพลิเคชัน นั้นคือทั้งหมด.


สิ่งต่าง ๆ นั้นไม่ง่ายนักกับระบบไฟล์ทั้งหมด - ตัวอย่างเช่นใน HFS + ของ Apple มีเพียงต้นไม้ใหญ่ B + หนึ่งที่ประกอบด้วยชื่อพา ธ ทั้งหมดถ้าฉันจำได้อย่างถูกต้อง - แต่การสังเกตนี้เป็นจุดสำหรับระบบไฟล์ Unix สูงสุด อาจเป็นสิ่งที่ผู้เขียนบทช่วยสอนอ้างถึงกำลังคิดอยู่
zwol

2

ไดเรกทอรีเป็นไฟล์เนื่องจากระบบลินุกซ์จ้างสากล I / O รุ่น ในรูปแบบทุกอย่างในระบบเป็นไฟล์และสามารถเข้าถึงได้ด้วยการเรียกระบบเดียวกันและคำสั่งต่างๆ

เป็นชนิดพิเศษเนื่องจาก i-nodes มีเครื่องหมายสำหรับประเภทไฟล์และมีโครงสร้างพิเศษในการเป็นตารางชื่อไฟล์และลิงก์ไปยัง i-nodes อื่น ๆ คู่ชื่อไฟล์ลิงค์เหล่านี้หรือที่เรียกว่า "hardlinks" ใน i-node ของไดเรกทอรีระบุไฟล์ "ภายใน" ไดเรกทอรี

ไดเรกทอรีเป็นเพียงการจัดระเบียบไฟล์ เมื่อไฟล์ถูก "ย้าย" จากไดเรกทอรีหนึ่งไปอีกไฟล์หนึ่งเองจะไม่ย้ายตำแหน่งในดิสก์ เป็นเพียงว่ารายการในหนึ่งไดเรกทอรี i-nodes ถูกลบและเขียนในอีกไดเรกทอรี i-node


-3

คำตอบที่ยอมรับนั้นไม่ถูกต้องสมบูรณ์ ในระบบ POSIX "Inodes" ชี้ไปที่ไฟล์และไดเรกทอรี ตัวอธิบายไฟล์นั้นมีลักษณะเฉพาะสำหรับกระบวนการและไม่ข้ามระบบ อย่างไรก็ตาม Inodes นั้นมีลักษณะเฉพาะตัวแม้ว่า inode มากกว่าหนึ่งอันสามารถชี้ไปที่ไฟล์เดียวได้ จะได้แสดงความคิดเห็นในคำตอบที่ยอมรับ แต่ไม่สามารถทำได้เนื่องจากข้อ จำกัด ตัวแทน


2
ไม่ได้ไอโหนดเดียวเท่านั้นที่สามารถชี้ไปที่ไฟล์เดียวกันได้ แม้ว่า inode เดียวกันสามารถมีอยู่ได้พร้อมกันในหลาย ๆ ไดเรกทอรี (หรือหลายชื่อ) ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txtการตรวจสอบเรื่องง่าย: ดังนั้นคุณจะเห็นว่าฮาร์ดลิงก์มีหมายเลขไอโหนดเดียวกัน
peterh กล่าวว่าคืนสถานะโมนิก้า

ตัวอธิบายไฟล์ @peterh เป็นค่าเฉพาะสำหรับกระบวนการ คุณสามารถอธิบาย?
alamin

1
@ Md.AlaminMahamud มันไม่เป็นความจริงถ้ากระบวนการfork()s กระบวนการลูกของมันจะมี (ยกเว้นบางกรณีพิเศษคือO_CLOEXECธง) ตรงเอนทิตีตัวยื่นแบบเดียวกับที่กระบวนการเดิมมี อีกตัวอย่างหนึ่ง: กระบวนการ child apache กำลังทำงานlisten()บน descriptor ไฟล์ซ็อกเก็ตเดียวกัน แต่คำตอบนี้ไม่ได้เกี่ยวกับ file descriptors ซึ่งเป็นโครงสร้างข้อมูลภายในเคอร์เนลและมีอยู่ในหน่วยความจำเคอร์เนลเท่านั้น คำตอบ( false ) นี้เกี่ยวกับรายการไดเรกทอรีและ inodes ซึ่งเป็นหน่วยงานบนดิสก์ (เช่นเป็นไบต์จริงในฮาร์ดไดรฟ์)
เตอร์กล่าวคืนสถานะโมนิก้า

1
@ Md.AlaminMahamud ดีตอนนี้ฉันไม่แน่ใจมากเช่นถ้าfork()เกิดขึ้นแล้วเด็กกระบวนการseek()s หรือclose()s มันจะไม่ส่งผลกระทบต่อไฟล์อธิบายของผู้ปกครอง ตอนนี้ฉันกำลังคิดอยู่ว่าตัวอธิบายไฟล์เป็นเพียงบางส่วนของโครงสร้างกระบวนการส่วนตัว แต่คำถามนี้ไม่เกี่ยวกับพวกเขาคำถามนี้เกี่ยวกับ dirents / inodes และฉันกำลังแสดงความคิดเห็นคุยกับคุณเกี่ยวกับคำตอบที่ผิดทั้งหมดสำหรับคำถามนี้
peterh กล่าวว่าคืนสถานะโมนิก้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.