ฉันกำลังอ่านบทช่วยสอน Unix นี้และพบข้อความอ้างอิงนี้
เราควรทราบไว้ที่นี่ว่าไดเรกทอรีเป็นเพียงไฟล์ชนิดพิเศษ
... แต่ไม่มีคำอธิบายหรือรายละเอียดใด ๆ ไดเรกทอรีเป็นเพียงไฟล์ได้อย่างไร?
ฉันกำลังอ่านบทช่วยสอน Unix นี้และพบข้อความอ้างอิงนี้
เราควรทราบไว้ที่นี่ว่าไดเรกทอรีเป็นเพียงไฟล์ชนิดพิเศษ
... แต่ไม่มีคำอธิบายหรือรายละเอียดใด ๆ ไดเรกทอรีเป็นเพียงไฟล์ได้อย่างไร?
คำตอบ:
เอนทิตีหลายแห่งในระบบปฏิบัติการสไตล์ * nix (และอื่น ๆ ) ได้รับการพิจารณาว่าเป็นไฟล์หรือมีลักษณะเหมือนไฟล์ที่กำหนดแม้ว่าพวกเขาจะไม่จำเป็นต้องเรียงลำดับไบต์ที่เก็บไว้ในระบบไฟล์ วิธีการนำไดเรกทอรีไปใช้นั้นขึ้นอยู่กับชนิดของระบบแฟ้ม แต่โดยทั่วไปแล้วสิ่งที่มีอยู่ในรายการถือว่าเป็นลำดับของไบต์ที่เก็บไว้ดังนั้นในแง่นั้นพวกเขาไม่ได้พิเศษ
วิธีหนึ่งในการกำหนดว่า "ไฟล์" นั้นอยู่ในบริบท * nix คือมันเป็นสิ่งที่มีตัวอธิบายไฟล์ที่เกี่ยวข้อง ตามบทความของวิกิพีเดียอธิบายไฟล์
เป็นตัวบ่งชี้เชิงนามธรรมที่ใช้ในการเข้าถึงไฟล์หรือทรัพยากรอินพุต / เอาท์พุตอื่น ๆเช่นการเชื่อมต่อไพพ์หรือเครือข่าย ...
กล่าวอีกนัยหนึ่งพวกเขาอ้างถึงทรัพยากรประเภทต่าง ๆ จาก / ที่ลำดับของไบต์อาจอ่าน / เขียนแม้ว่าแหล่งที่มา / ปลายทางของลำดับนั้นจะไม่ได้ระบุ กล่าวอีกนัยหนึ่งว่า "ที่ไหน" ของทรัพยากรอาจเป็นอะไรก็ได้ สิ่งที่กำหนดว่ามันคือสื่อกลางของข้อมูล นี่เป็นส่วนหนึ่งของสาเหตุที่บางครั้งมีการกล่าวว่าในยูนิกซ์ "ทุกอย่างเป็นไฟล์" คุณไม่ควรใช้สิ่งนี้อย่างแท้จริง แต่ควรพิจารณาอย่างจริงจัง ในกรณีของไดเรกทอรีข้อมูลนี้เกี่ยวข้องกับสิ่งที่อยู่ในไดเรกทอรีและในระดับที่ต่ำกว่าการนำไปใช้งานวิธีค้นหาภายในระบบแฟ้ม
ไดเรกทอรีมีลักษณะพิเศษในแง่นี้เพราะในรหัสภาษา C พวกมันไม่เกี่ยวข้องกับตัวให้คำอธิบายไฟล์อย่างชัดเจน POSIX API DIR*
ใช้ชนิดพิเศษที่จับกระแส แต่ประเภทนี้ไม่ในความเป็นจริงมีคำอธิบายถึงพื้นฐานซึ่งสามารถเรียกดูได้ Descriptors ได้รับการจัดการโดยเคอร์เนลและการเข้าถึงพวกเขามักจะเกี่ยวข้องกับการเรียกระบบดังนั้นด้านอื่น ๆ ของสิ่งที่อธิบายคือมันเป็นท่อควบคุมโดยเคอร์เนลระบบปฏิบัติการ พวกเขามีหมายเลขที่ไม่ซ้ำกัน (ต่อกระบวนการ) เริ่มต้นด้วย 0 ซึ่งโดยปกติจะเป็นตัวบ่งชี้สำหรับ สตรีมอินพุตมาตรฐาน
openat
, fstatat
ฯลฯ ) ซึ่งใช้อธิบายไฟล์หมายถึงไดเรกทอรี
fsync()
ไดเรกทอรีอ่านอย่างเดียว (!) fd และมีเอฟเฟกต์ที่กำหนดไว้อย่างชัดเจน (โดยเฉพาะมันซิงค์การสร้างไฟล์ / เปลี่ยนชื่อ / ลบในไดเรกทอรีที่กำหนดไปยังดิสก์ซึ่งเป็นขั้นตอนที่จำเป็น เป็นไฟล์ชั่วคราวและเปลี่ยนชื่อเป็น "สำนวนดั้งเดิม"
ใน Unix Way of Doing Things: ทุกอย่างเป็นไฟล์
ไดเรกทอรีคือไฟล์พิเศษชนิดหนึ่ง (จากมาก) ไม่มีข้อมูล แต่จะมีตัวชี้ไปยังไฟล์ทั้งหมดที่อยู่ในไดเรกทอรี
ไฟล์พิเศษประเภทอื่น ๆ :
แต่เนื่องจากพวกเขาถูกพิจารณาว่าเป็น "ไฟล์" คุณสามารถls
เปลี่ยนชื่อและย้ายพวกมันและขึ้นอยู่กับประเภทของไฟล์พิเศษส่งข้อมูลไปยัง / จากพวกเขา
คำตอบของฉันคือการระลึกเพียงอย่างเดียว แต่ใน 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
cp --link dir1/* dir2
แม้ว่าฉันจะไม่แน่ใจเกี่ยวกับการใช้งานของมัน
ไดเรกทอรีเป็นพิเศษในการที่มันมี 'd' ในโหมดของมันบอกระบบไฟล์ว่ามันควรตีความเนื้อหาของมันเป็นรายการของไฟล์อื่น ๆ ที่มีอยู่ในไดเรกทอรีมากกว่าไฟล์ปกติที่เป็นเพียงลำดับของไบต์ที่จะ อ่านโดยแอปพลิเคชัน นั้นคือทั้งหมด.
ไดเรกทอรีเป็นไฟล์เนื่องจากระบบลินุกซ์จ้างสากล I / O รุ่น ในรูปแบบทุกอย่างในระบบเป็นไฟล์และสามารถเข้าถึงได้ด้วยการเรียกระบบเดียวกันและคำสั่งต่างๆ
เป็นชนิดพิเศษเนื่องจาก i-nodes มีเครื่องหมายสำหรับประเภทไฟล์และมีโครงสร้างพิเศษในการเป็นตารางชื่อไฟล์และลิงก์ไปยัง i-nodes อื่น ๆ คู่ชื่อไฟล์ลิงค์เหล่านี้หรือที่เรียกว่า "hardlinks" ใน i-node ของไดเรกทอรีระบุไฟล์ "ภายใน" ไดเรกทอรี
ไดเรกทอรีเป็นเพียงการจัดระเบียบไฟล์ เมื่อไฟล์ถูก "ย้าย" จากไดเรกทอรีหนึ่งไปอีกไฟล์หนึ่งเองจะไม่ย้ายตำแหน่งในดิสก์ เป็นเพียงว่ารายการในหนึ่งไดเรกทอรี i-nodes ถูกลบและเขียนในอีกไดเรกทอรี i-node
คำตอบที่ยอมรับนั้นไม่ถูกต้องสมบูรณ์ ในระบบ POSIX "Inodes" ชี้ไปที่ไฟล์และไดเรกทอรี ตัวอธิบายไฟล์นั้นมีลักษณะเฉพาะสำหรับกระบวนการและไม่ข้ามระบบ อย่างไรก็ตาม Inodes นั้นมีลักษณะเฉพาะตัวแม้ว่า inode มากกว่าหนึ่งอันสามารถชี้ไปที่ไฟล์เดียวได้ จะได้แสดงความคิดเห็นในคำตอบที่ยอมรับ แต่ไม่สามารถทำได้เนื่องจากข้อ จำกัด ตัวแทน
ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txt
การตรวจสอบเรื่องง่าย: ดังนั้นคุณจะเห็นว่าฮาร์ดลิงก์มีหมายเลขไอโหนดเดียวกัน
fork()
s กระบวนการลูกของมันจะมี (ยกเว้นบางกรณีพิเศษคือO_CLOEXEC
ธง) ตรงเอนทิตีตัวยื่นแบบเดียวกับที่กระบวนการเดิมมี อีกตัวอย่างหนึ่ง: กระบวนการ child apache กำลังทำงานlisten()
บน descriptor ไฟล์ซ็อกเก็ตเดียวกัน แต่คำตอบนี้ไม่ได้เกี่ยวกับ file descriptors ซึ่งเป็นโครงสร้างข้อมูลภายในเคอร์เนลและมีอยู่ในหน่วยความจำเคอร์เนลเท่านั้น คำตอบ( false ) นี้เกี่ยวกับรายการไดเรกทอรีและ inodes ซึ่งเป็นหน่วยงานบนดิสก์ (เช่นเป็นไบต์จริงในฮาร์ดไดรฟ์)
fork()
เกิดขึ้นแล้วเด็กกระบวนการseek()
s หรือclose()
s มันจะไม่ส่งผลกระทบต่อไฟล์อธิบายของผู้ปกครอง ตอนนี้ฉันกำลังคิดอยู่ว่าตัวอธิบายไฟล์เป็นเพียงบางส่วนของโครงสร้างกระบวนการส่วนตัว แต่คำถามนี้ไม่เกี่ยวกับพวกเขาคำถามนี้เกี่ยวกับ dirents / inodes และฉันกำลังแสดงความคิดเห็นคุยกับคุณเกี่ยวกับคำตอบที่ผิดทั้งหมดสำหรับคำถามนี้