เหตุใดไดเรกทอรีใหม่จึงมีฮาร์ดลิงก์นับ 2 ก่อนที่จะเพิ่มสิ่งใดเข้าไปในนั้น


38

สมมติว่าฉันเพิ่งสร้างไดเรกทอรีใหม่ไดเรกทอรีแล้วฉันทำคำสั่ง ls -ld ฉันเห็นว่าจำนวนฮาร์ดลิงก์คือ 2 อะไรทำให้ฮาร์ดลิงก์ 2 ตั้งแต่เริ่มต้น? นอกจากนี้ยังมีจำนวนไดเรกทอรีย่อยในไดเรกทอรีปัจจุบันเท่ากับจำนวนฮาร์ดลิงก์ - 2?


คำถามที่คล้ายกันมากหรือเกี่ยวข้อง: unix.stackexchange.com/questions/22664/… , unix.stackexchange.com/questions/22664/… , unix.stackexchange.com/questions/21847/ …
Bruce Ediger

คำตอบ:


39

ในอดีตระบบไฟล์ Unix แรกสร้างสองรายการในทุกไดเรกทอรี: .ชี้ไปที่ไดเรกทอรีตัวเองและ..ชี้ไปที่ผู้ปกครอง นี่เป็นวิธีที่ง่ายในการสำรวจระบบไฟล์ทั้งสำหรับแอปพลิเคชันและสำหรับระบบปฏิบัติการ

ดังนั้นแต่ละไดเรกทอรีจะมีลิงค์นับเป็น 2 + n โดยที่ n คือจำนวนไดเรกทอรีย่อย ลิงก์คือรายการสำหรับไดเรกทอรีนั้นในพาเรนต์.รายการของตนเองของไดเรกทอรีและ..รายการในแต่ละไดเรกทอรีย่อย ตัวอย่างเช่นสมมติว่านี่เป็นเนื้อหาของทรีย่อยที่ root ที่/parentไดเร็กทอรีทั้งหมด:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

จากนั้นdirมีจำนวนการเชื่อมโยงของ 5: dirรายการใน/parentที่.รายการใน/parent/dirและทั้งสาม..รายการในแต่ละ/parent/dir/sub1, และ/parent/dir/sub2 /parent/dir/sub3เนื่องจาก/parent/dir/sub1ไม่มีไดเรกทอรีย่อยการนับลิงก์คือ 2 ( sub1รายการใน/parent/dirและ.รายการใน/parent/dir/sub1)

เพื่อลดจำนวนของการทำพิเศษสำหรับไดเร็กทอรีรูทซึ่งไม่มีพาเรนต์ "ที่เหมาะสม" ไดเร็กทอรีรูทจะมี..รายการที่ชี้ไปยังตัวเอง วิธีนี้มันเกินไปมีจำนวนการเชื่อมโยงของ 2 บวกจำนวนไดเรกทอรีย่อยที่ 2 เป็นอยู่และ/./..

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

ระบบไฟล์ส่วนใหญ่ยังคงรายงานจำนวนลิงก์ของ 2 + n สำหรับไดเรกทอรีโดยไม่คำนึงว่ามี.และ..รายการอยู่หรือไม่ แต่มีข้อยกเว้นตัวอย่างเช่น btrfs ไม่ได้ทำเช่นนี้


4
..การชี้ไปที่พาเรนต์จะไม่ส่งผลต่อการนับลิงค์ของไดเรกทอรีปัจจุบัน จำนวน 2 มาจาก.และรายชื่อ (ดั้งเดิม) ของไดเรกทอรีเอง วิธีที่คุณทำให้มันดูคลุมเครือเล็กน้อยและทำให้มันดูเหมือน.และ..เป็นสองอย่าง ..ควรจะใช้เพื่ออธิบายวิธีการทางคณิตศาสตร์ทำงานออกไป2+n:)
th3an0maly

@ th3an0maly การชี้ไปที่ผู้ปกครองจะมีผลต่อการนับลิงก์ของผู้ปกครอง ฉันไม่เห็นจริง ๆ ว่า "รายการ .. ในแต่ละไดเรกทอรีย่อย" นั้นคลุมเครือและฉันไม่เข้าใจความหมายของคำว่า "รายชื่อไดเรกทอรีของตัวเอง"
Gilles 'ดังนั้นหยุดความชั่วร้าย'

จริงๆแล้วคำตอบนี้: unix.stackexchange.com/a/101516/160264เป็นสิ่งที่ฉันบอกใบ้ อ่านหลังจากที่ฉันอ่านคำตอบของคุณเนื่องจากคุณเป็นคนที่อยู่ด้านบนสุด
th3an0maly

@ th3an0maly ฉันยังไม่รู้ว่าสิ่งที่คุณกำลังพูดถึงอยู่ คุณสามารถแสดงมันได้ชัดเจนแทนที่จะบอกเป็นนัย ๆ ?
Gilles 'หยุดความชั่วร้าย'

คำตอบของ @ goldilocks ชัดเจน สิ่งที่ฉันหมายถึงคือคำตอบของคุณอาจเป็นเหมือนเขามากขึ้น แต่ฉันไม่ได้อ่านคำตอบของเขาเมื่อฉันอ่านคำตอบของคุณ บรรทัดแรกเป็นสิ่งที่ความคิดเห็นดั้งเดิมของฉันพูดว่า: "มีอยู่หนึ่งรายการสำหรับไดเรกทอรีและอีกหนึ่งรายการ.อยู่ในนั้น" หากยังไม่ชัดเจนสำหรับคุณฉันเสียใจมากฉันไม่สามารถชี้แจงเพิ่มเติมได้ สิ่งที่ฉันทำได้ดีกว่าก็คือคัดลอก + วางคำตอบของเขาที่นี่ในความคิดเห็น
th3an0maly

13

มีหนึ่งสำหรับไดเรกทอรีตัวเองและหนึ่งสำหรับ.ภายในนั้น

นอกจากนี้ยังมีจำนวนไดเรกทอรีย่อยในไดเรกทอรีปัจจุบันเท่ากับจำนวนฮาร์ดลิงก์ - 2?

มันสมเหตุสมผลแล้วเนื่องจากแต่ละไดเรกทอรีย่อยสร้าง..ฮาร์ดลิงก์และยิ่งกว่านั้นคุณไม่สามารถสร้างลิงก์ไปยังไดเรกทอรีได้ 1 อย่างไรก็ตามฉันจะไม่ไว้ใจสิ่งนี้อย่างจริงจังโดยเฉพาะ เนื่องจากเป็นการง่ายที่จะนับไดเรกทอรีย่อยและรับจำนวนจริง

หากคุณเพียงแค่ดูที่lsเอาต์พุตเพื่อหาแนวคิดของจำนวนหมวดย่อยที่มีอยู่นั่นจะทำให้คุณมีความคิดที่ดี

1lnหรืออย่างน้อยคุณจะไม่สามารถมี ฉันไม่ได้พยายามเขียนโปรแกรมและman 2 linkคลุมเครือ - ไม่มีข้อผิดพลาดที่เห็นได้ชัดสำหรับการเชื่อมโยงไปยังไดเรกทอรีแม้ว่าจะมีคู่ที่อาจใช้ ( EMLINK, EPERM) ดังนั้นหากไม่มีมาตรฐานบางแห่งที่ระบุว่ามีการเชื่อมโยงฮาร์ดไดรฟ์ที่เป็นไปได้เพียงไดเรกทอรีเดียว.และ..อีกครั้งฉันจะถือว่าลิงก์ฮาร์ดไดรฟ์นั้นนับเป็นเงื่อนงำที่ไม่เป็นทางการ


2
ไม่ว่าจะอนุญาตให้ลิงก์ไปยังไดเรกทอรีหรือไม่และคุณสามารถนับจำนวนย่อยจากการนับลิงก์ได้หรือไม่นั้นขึ้นอยู่กับว่าคุณใช้ระบบไฟล์ใดบ้างอนุญาตบางอันไม่ได้
alanc

โปรดทราบว่า Time Machine ของ macOS จริง ๆ แล้วฮาร์ดลิงก์ไดเรกทอรีไปยังการสำรองข้อมูลก่อนหน้า; วิธีที่พวกเขาสามารถทำเป็นว่าการสำรองข้อมูลส่วนเพิ่มแต่ละรายการเป็นสำเนาเต็มและพวกเขาสามารถลบส่วนเพิ่มใด ๆ โดยไม่ส่งผลกระทบต่อผู้อื่น นอกจากนี้ยังเปราะบางมากฉันเล่นกับมันโดยใช้ syscalls ปกติและฉันก็ปิดระบบไฟล์ของฉันอย่างละเอียด
w00t
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.