บน Unix โดยทั่วไปไฟล์เป็นรายการบางรายการในสารบัญ มีไฟล์หลายประเภท: ไฟล์ปกติ, อุปกรณ์, ลิงก์สัญลักษณ์, ประตู, ท่อ, ซ็อกเก็ต, ไดเรกทอรี ...
หมายเลขไอโหนด (ซึ่งคุณสามารถเห็นได้ในผลลัพธ์ls -i
) เป็นดัชนีในตารางนั้น
ตอนนี้คุณทำไม่ได้ไฟล์การเข้าถึงโดยinodeแต่เส้นทาง เส้นทางเป็นห่วงโซ่ของไดเรกทอรีรายการ คุณจะสังเกตเห็นว่าเราไม่ได้พูดถึงโฟลเดอร์แต่เป็นไดเรกทอรีที่นี่ เพราะมันคือสิ่งที่เป็นไดเรกทอรี (คิดว่าสมุดโทรศัพท์)
ไดเร็กทอรีเป็นไฟล์ชนิดพิเศษที่ให้ชื่อแก่จำนวน inodes รายการไดเร็กทอรีคือการแม็พจากชื่อไปยัง inode
ไฟล์ที่กำหนด (inode) สามารถมีได้มากกว่าหนึ่งชื่อในหนึ่งไดเรกทอรี (เช่นเดียวกับที่มีมากกว่าหนึ่งชื่อที่หมายเลขโทรศัพท์) และยังสามารถมีชื่อ (รายการ) ในไดเรกทอรีมากกว่าหนึ่ง ลิงก์เหล่านั้นเรียกว่าลิงก์ซึ่งเรียกว่าฮาร์ดลิงก์เพื่อแยกความแตกต่างกับซอฟต์ลิงก์ (ไฟล์ชนิดพิเศษซึ่งเป็นตัวชี้ไปยังพา ธ )
ไฟล์ (inode) ติดตามจำนวนลิงก์ (ของรายการในไดเรกทอรีใด ๆ ) ที่มีดังนั้นเมื่อจำนวนถึง 0 (เมื่อมันถูกยกเลิกการเชื่อมโยงจากไดเรกทอรีสุดท้ายที่ถูกอ้างอิงใน) มันจะถูกจัดสรรคืน
นั่นคือหมายเลขนั้น (จำนวนลิงก์) ที่แสดงในls -l
เอาต์พุต
เมื่อไฟล์ที่ไม่ใช่ไดเรกทอรีถูกสร้างขึ้นเป็นครั้งแรก (ที่มีopen
หรือcreat
(หรือbind
หรือmknod
บางประเภทของไฟล์) สายระบบ) ก็จะทำโดยการให้มีเส้นทางไปยังไฟล์ใหม่ (ชอบ"/a/b"
) สิ่งที่เกิดขึ้นคือไฟล์ใหม่และมีการจัดสรร inode และมีการเพิ่มรายการใหม่ในไดเรกทอรีที่เกี่ยวข้องกับ"a"
ชื่อใน"/"
ไดเรกทอรีราก นั่นคือลิงค์เริ่มต้นดังนั้นจำนวนลิงก์จึงเป็นหนึ่ง
สามารถเพิ่มลิงก์เพิ่มเติมได้ในภายหลังด้วยการlink()
เรียกระบบ ( ln
คำสั่ง) และลิงก์สามารถลบออกได้ด้วยการunlink()
เรียกระบบ ( rm
คำสั่ง)
คุณจะสังเกตเห็นว่าไฟล์ประเภทไดเรกทอรีโดยทั่วไปมีจำนวนลิงก์มากกว่าหรือเท่ากับ 2
ตอนนี้เมื่อคุณสร้างไดเรกทอรีคุณกำลังเรียกการโทรของmkdir()
ระบบ mkdir("/a/b")
สิ่งที่ชอบ สิ่งที่มันทำคือการจัดสรรไฟล์ใหม่ของไดเรกทอรีประเภท ในไดเรกทอรีใหม่นั้นมันจะสร้างสองรายการโดยอัตโนมัติ:
"."
( จุดสำหรับไดเรกทอรี ) ซึ่งเป็นลิงค์ไปสู่ตัวมันเอง ดังนั้นการนับลิงก์จึงเป็น 1
".."
(สำหรับไดเรกทอรีของไดเรกทอรี ) "/a"
ซึ่งเป็นเชื่อมโยงไปยัง ดังนั้นจำนวนลิงก์ของ"/a"
จะเพิ่มขึ้นทีละหนึ่ง
จากนั้นไดเรกทอรีใหม่นั้นจะถูกลิงก์ไปยัง"/a"
(มีการเพิ่มรายการไว้ใน"/a"
นั้น) ดังนั้นการนับลิงก์จะเป็น 2 ในขณะนี้หากมี"/a/b/c"
การสร้างไดเรกทอรีเนื่องจาก".."
รายการใน"/a/b/c"
การนับลิงก์"/a/b"
จะกลายเป็น 3
Unices ส่วนใหญ่ จำกัด การสร้างลิงก์เพิ่มเติมไปยังไดเรกทอรีเนื่องจากอาจทำให้เกิดปัญหาได้ เมื่อพวกเขาอนุญาตlink()
ในไดเรกทอรีโดยทั่วไป superuser เท่านั้นที่สามารถทำได้
ระบบไฟล์บางระบบเช่นbtrfs
ออกจากโครงสร้างไดเรกทอรีดั้งเดิมนั้น คุณจะสังเกตเห็นว่าลิงก์นั้นมีอยู่ในไดเรกทอรีในbtrfs
ระบบไฟล์เสมอแม้ว่าไดเรกทอรีเหล่านั้นจะมี"."
รายการที่มีหมายเลขไอโหนดเหมือนกันกับตัวมันเอง
ความจริงที่ว่าจำนวนลิงก์เป็นแบบดั้งเดิม 2 บวกกับจำนวนย่อยที่มีการใช้งาน ตัวอย่างเช่นใน:
find . -name '*.c' -print
หาก.
ไม่มีส่วนย่อย แต่มีจำนวนไฟล์นับล้าน โดยการตรวจสอบการเชื่อมโยงของการนับ.
, find
สามารถรู้ว่าไม่มี subdir ดังนั้นสิ่งที่find
ต้องทำคืออ่านเนื้อหาของไดเรกทอรีและรายงานรายการที่ลงท้ายด้วย.c
(เช่นgrep '\.c$'
ไฟล์ megabyte ไม่กี่ไฟล์, ไม่มีเรื่องใหญ่) มิฉะนั้นfind
จะต้องตรวจสอบประเภทของไฟล์ทุกไฟล์เพื่อดูว่ามีไดเรกทอรีที่จะลงไปในนั้นหรือไม่ (ส่งผลให้หลาย ๆ ไฟล์ยังไม่จำเป็น)lstat()
ไม่ แน่นอนว่าการเพิ่มประสิทธิภาพประเภทนี้ไม่สามารถใช้งานได้btrfs
(แม้ว่าใน Linux รุ่นที่ทันสมัยประเภทของไฟล์จะถูกเก็บไว้ในรายการไดเรกทอรีสำหรับระบบไฟล์บางระบบ (รวมถึงbtrfs
) และส่งคืนโดย thegetdents(2)
เรียกระบบที่ใช้เพื่อเรียกรายการของรายการ ในไดเรกทอรีดังนั้นlstat