fd เดียวกันในกระบวนการต่าง ๆ สามารถชี้ไปที่ไฟล์เดียวกันได้อย่างไร?


25

ว่าฉันมีขั้นตอนที่ 1และขั้นตอนที่ 2 ทั้งสองมีตัวอธิบายไฟล์ที่สอดคล้องกับจำนวนเต็ม 4

ในแต่ละกระบวนการอย่างไรก็ตามไฟล์ descriptor 4 ชี้ไปที่ไฟล์ต่างกันโดยสิ้นเชิงใน Open File Table ของเคอร์เนล:

ป้อนคำอธิบายรูปภาพที่นี่

เป็นไปได้อย่างไร? ไฟล์ descriptor ไม่ควรเป็นดัชนีไปยังระเบียนใน Open File Table หรือไม่


1
คำถามที่ดี! ฉันเดาว่าตัวแปลไฟล์ถูกแปลแล้วเพื่อให้ fd 4ในกระบวนการทั้งสองนั้นสัมพันธ์กับจำนวนของ fd ที่เปิดอยู่ Fd 0-2(stdin, stdout, sdterr) จะเปิดขึ้นเสมอสำหรับกระบวนการใหม่และหมายเลขจะไม่ถูกสงวนไว้สำหรับกระบวนการนั้นเท่านั้น


@ jw013 ฉันคิดว่ามันฟังดูคุ้นเคย \ @Pithikos วิธีนี้ไม่ซ้ำกันได้อย่างไร
Michael Mrozek

1
นี่เป็นไดอะแกรมที่ไม่ดี - มันควรแสดงให้เห็นว่า file descriptor 4 หมายถึงรายการที่สี่ [ดี, ที่ห้า, นับจากศูนย์] ของตาราง descriptor ไฟล์ทางด้านซ้าย, ไม่ใช่รายการที่มี "4" "4" จริงเกิดขึ้นในตัวแปร userspace ของคุณที่มีตัวเลข แผนภาพในคำถามอื่นนั้นดีกว่ามาก
Random832

2
@ Random832 ถ้าฉันรู้ว่าไดอะแกรมใดถูกต้องฉันคงไม่เคยทำคำถามนี้
Pithikos

คำตอบ:


35

อธิบายไฟล์เช่น4ในตัวอย่างของคุณเป็นดัชนีในกระบวนการเฉพาะตารางอธิบายไฟล์ , ไม่ตารางเปิดแฟ้ม รายการไฟล์ descriptor นั้นมีดัชนีไปยังรายการในตารางไฟล์โกลบอลของเคอร์เนลรวมถึงแฟล็ก descriptor ไฟล์


2
สำหรับเร็กคอร์ดมีเพียงหนึ่ง "file descriptor flag" ในระบบส่วนใหญ่คือแฟล็ก close-on-exec สถานะ "per-fd" อื่น ๆ ทั้งหมด (รวมถึงออฟเซ็ตและโหมดการเข้าถึง) เป็นส่วนหนึ่งของรายการตารางเปิดไฟล์
Random832

24

แต่ละกระบวนการมีตารางตัวอธิบายไฟล์ของตัวเอง ตัวอธิบายไฟล์ 4 ในกระบวนการ 1234 คะแนนภายในตารางของกระบวนการ 1234 ตัวอธิบายไฟล์ 4 ในกระบวนการ 5678 คะแนนภายในตารางของกระบวนการ 5678 กรณีที่คุณต้องคุ้นเคยคือ file descriptors 0, 1 และ 2 ซึ่งสำหรับแต่ละขั้นตอนคืออินพุตมาตรฐานเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐาน

กระบวนการสามารถเปิดไฟล์เดียวกันมากกว่าหนึ่งครั้ง สิ่งนี้อาจเกิดขึ้นโดยบังเอิญตัวอย่างเช่นเมื่อเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานของกระบวนการถูกเปลี่ยนเส้นทางไปยังเทอร์มินัลเดียวกันหรือไปยังไฟล์เดียวกัน รายการตารางไฟล์พื้นฐาน (เช่นLinuxstruct file ) มีมากกว่าข้อมูลเกี่ยวกับไฟล์ พวกเขายังมีโหมดการเปิด (เช่นอ่านหรือเขียน) และสถานะอื่น ๆ (เช่นธงเช่นปิด -on-exec) ตัวอย่างเช่นกระบวนการอาจเปิดเทอร์มินัลสำหรับการอ่านเฉพาะบน file descriptor 0 และเทอร์มินัลเดียวกันนั้นเปิดเพื่อการเขียนบน file descriptor 2 เท่านั้นรายการตารางไฟล์ยังมีตำแหน่งของกระบวนการในไฟล์ กระบวนการอาจต้องการlseekตำแหน่งที่แตกต่างกันสองตำแหน่งในไฟล์เดียวกันดังนั้นจะใช้dupเพื่อให้ได้สองตัวจัดการกับไฟล์นั้น


2
สิ่งนี้ไม่ถูกต้องทั้งหมด อ้างอิงจาก man page / specs dupทำสิ่งที่ตรงกับที่กล่าวไว้ในดีบุก: descriptors ที่ได้ทั้งคู่ชี้ไปที่รายการตารางไฟล์เดียวกันและแชร์ offset เดียวกัน เพื่อให้ได้รายการตารางไฟล์ที่แตกต่างกัน 2 รายการฉันค่อนข้างแน่ใจว่าคุณจำเป็นต้องopenใช้ไฟล์สองครั้ง
jw013

@Gilles "file descriptor 4 ในกระบวนการ 1234 คะแนนภายในตารางกระบวนการของ 1234" คุณหมายถึงตารางใด จากสิ่งที่ฉันรู้ตารางเฉพาะในกระบวนการเป็นไฟล์อธิบายตารางที่บันทึกในแต่ละจุดเคอร์เนลที่เดียว เปิดตารางไฟล์
Pithikos

ดูunix.stackexchange.com/questions/195057/…สำหรับคำอธิบายที่แม่นยำยิ่งขึ้น
Gilles 'หยุดความชั่วร้าย'

8

แต่ละกระบวนการมีตารางอธิบายไฟล์ของตัวเอง นั่นคือทั้งหมดที่

ทุกอย่างอธิบายไว้อย่างดีในการเขียนโปรแกรมเครือข่าย UNIXโดย Richard Stevens หากคุณต้องการเรียนรู้อย่างลึกซึ้ง


คุณหมายถึงตารางใด
Pithikos

1
ตารางตัวอธิบายไฟล์
MichałŠrajer

7

การอ้อมค้อมระดับพิเศษจะไม่แก้ไขปัญหาของคุณหรือไม่ ("ปัญหาทั้งหมดในการเขียนโปรแกรมคอมพิวเตอร์สามารถแก้ไขได้โดยการเพิ่มระดับทางอ้อม" - เป็นคนฉลาดสีเทา) นั่นคือจำนวนเต็มขนาดเล็กในแต่ละกระบวนการสิ้นสุดลงในฐานะดัชนีลงในอาร์เรย์ต่อกระบวนการของดัชนีพื้นที่เคอร์เนลลงใน "Open File Table"


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