file descriptor กับชื่อไฟล์


12

ฉันสงสัยว่าความแตกต่างและความสัมพันธ์ระหว่างตัวอธิบายไฟล์และชื่อไฟล์คืออะไร พวกเขาทั้งหมดคุ้นเคยกับการเข้าถึงไฟล์หรือไม่? ถ้าใช่ด้วยวิธีเดียวกัน

ตัวอย่างเช่น/dev/fd/0, /dev/stdinและมีการเชื่อมโยงทั้งหมดเพื่อ/proc/self/fd/0 /dev/pts/2คำอธิบายไฟล์สี่ไฟล์นี้หรือชื่อไฟล์?


คำตอบ:


12

ทั้งสี่ของ/dev/fd/0, /dev/stdin, /proc/self/fd/0และ/dev/pts/2เป็นชื่อไฟล์เช่นเดียวกับ/////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijfฯลฯ ทั้งหมด แต่ที่ตัวอย่างสุดท้ายมีแนวโน้มที่จะเป็นชื่อของไฟล์ที่มีอยู่บนเครื่องของคุณ ชื่อไฟล์คือสตริงที่สามารถกำหนดไฟล์บนระบบไฟล์ของคุณ ภายใต้ Linux สตริงใด ๆ ที่ไม่มีไบต์ว่างและมีความยาวไม่เกิน 4096 ไบต์เป็นชื่อไฟล์ที่ถูกต้อง มีชื่อหลายชื่อเหล่านี้จะเทียบเท่าเช่น/bin/shเทียบเท่ากับ///bin/sh, /bin/../bin/sh(สมมติว่า/binเป็นไดเรกทอรีที่มีอยู่) ฯลฯ ทั้งหมดตัวอย่างที่ผมเคยได้รับเพื่อให้ห่างไกลที่มีชื่อไฟล์ที่แน่นอน; นอกจากนี้ยังมีชื่อไฟล์แบบสัมพัทธ์ซึ่งไม่ได้ขึ้นต้นด้วย/และมีความหมายขึ้นอยู่กับไดเรกทอรีปัจจุบัน

คำศัพท์ที่ล้อมรอบชื่อไฟล์ไม่เป็นสากล บางครั้ง "ชื่อไฟล์" หมายถึงเส้นทางแบบเต็มไปยังไฟล์และบางครั้งก็หมายถึงชื่อของรายการไดเรกทอรี คำศัพท์ POSIX คือ " ชื่อไฟล์ " หรือ " ส่วนประกอบชื่อพา ธ " สำหรับชื่อของรายการไดเรกทอรีและ " ชื่อพา ธ " สำหรับเส้นทางแบบเต็ม

file descriptor กำหนดไฟล์เปิดในกระบวนการเฉพาะ เคอร์เนลรักษาตารางของตัวให้คำอธิบายไฟล์สำหรับแต่ละกระบวนการ แต่ละรายการในตาราง file descriptor ระบุว่าต้องทำอย่างไรหากกระบวนการร้องขอการอ่านการเขียนและการดำเนินการอื่น ๆ บน file descriptor

ตัวอธิบายไฟล์อาจสอดคล้องกับไฟล์และมีชื่อที่เกี่ยวข้อง แต่ไม่ใช่ทั้งหมดที่ทำ สำหรับผู้ที่ทำไฟล์อาจเป็นไฟล์ปกติไดเรกทอรีไฟล์อุปกรณ์หรือไปป์ที่มีชื่อ (เรียกว่า FIFO) (ชนิดที่สร้างขึ้นโดยmkfifo); ระบบบางระบบมีความเป็นไปได้เพิ่มเติมเช่นซ็อกเก็ตยูนิกซ์และประตู ตัวอย่างของการอธิบายไฟล์ที่ไม่ได้มีการตั้งชื่อไฟล์ที่เกี่ยวข้องรวมถึงท่อ (ชนิดที่สร้างขึ้นโดยpipe) และเครือข่ายซ็อกเก็ต

/dev/fd/0, /dev/stdinและ/proc/self/fd/0เป็นชื่อไฟล์ (เทียบเท่าทั้งหมด) มีความหมายที่แปลกประหลาดที่พวกเขากำหนดทั้งหมดแล้วแต่จำนวนใดจะเข้าถึงไฟล์ผ่านทางไฟล์อธิบาย 0. เมื่อกระบวนการเปิดเหล่านี้เคอร์เนลสำเนารายการที่มีค่าดัชนี 0 ในตารางอธิบายไฟล์อธิบายไปอยู่ที่ใหม่ ข้อบ่งชี้ dup(0)เปิดไฟล์เหล่านี้จะเทียบเท่ากับการโทร ไฟล์ที่กำหนดชื่อเป็นวิธีที่จะทำให้กระบวนการใช้ไฟล์ที่เปิดอยู่แล้วโดยทางอ้อมแทนที่จะเปิดไฟล์ใหม่ ส่วนใหญ่จะเป็นประโยชน์ในการส่งผ่านบรรทัดคำสั่งของโปรแกรมซึ่งโปรแกรมคาดว่าชื่อของไฟล์ที่จะเปิด


@Giles คุณเขียน "แต่ละรายการในตาราง descriptor file ระบุว่าจะทำอย่างไรถ้ากระบวนการร้องขอการอ่านการเขียนและการดำเนินการอื่น ๆ บน file descriptor" (การเน้นของฉัน) เท่าที่ฉันเข้าใจมันเป็นเพียงจำนวนเต็มเช่นมาตรฐาน 0,1,2 เป็นต้นสำหรับ stdin, stdout และ stderr ตามลำดับ มันจะเป็นตัวเลขที่มีมูลค่าสูงกว่าสำหรับไฟล์ปกติ สิ่งที่ฉันไม่ได้รับจากความคิดเห็นของคุณคือตัวเลขนี้ระบุว่า "ต้องทำอย่างไรหากกระบวนการร้องขอการอ่านการเขียนและการดำเนินการอื่น ๆ ในไฟล์ descriptor" . คุณช่วยขยายเรื่องนี้หน่อยได้ไหม?
Geek

@Geek รายการในตารางอธิบายไฟล์ไม่ใช่ตัวเลข ตัวเลขคือดัชนีลงในตารางนั้น
Gilles 'หยุดชั่วร้าย'

@Giles ขอบคุณสำหรับการชี้แจงความเข้าใจผิดของฉัน ตอนนี้ฉันเข้าใจแล้วดีขึ้น คุณช่วยยกตัวอย่างของ "สิ่งที่ต้องทำ" ในคำตอบของคุณได้ไหม ฉันรวบรวมว่าแต่ละรายการในตาราง descriptor ไฟล์อีกครั้งมีตัวชี้ไปยังตารางไฟล์ซึ่งมีข้อมูลเช่นไฟล์ออฟเซ็ตสถานะไฟล์ ฯลฯ แต่ฉันยังไม่ชัดเจนในส่วน "สิ่งที่ต้องทำ" ในคำตอบของคุณ
Geek

2

ชื่อไฟล์เป็นเพียงชื่อของไฟล์ในระบบไฟล์ไม่มีอะไรเพิ่มเติม - เป็นเพียงแค่สตริง

ตัวอธิบายไฟล์เป็นวัตถุชนิดหนึ่งซึ่งคุณสามารถอ่านและ / หรือเขียนได้ ไฟล์ถูกเปิดและพร้อมใช้งาน ไม่เพียง แต่มี file descriptors เท่านั้น - stdin, stdout และ stderr ยังเป็น descriptor คุณสามารถเขียนและอ่านจากพวกมันโดยใช้ฟังก์ชั่นเดียวกับไฟล์ (ยกเว้นคุณไม่สามารถหาตัวอย่าง) ตัวอย่างอื่น ๆ ของ descriptor ซึ่งไม่ใช่ไฟล์คือ: pipes ที่มีชื่อและซ็อกเก็ตเครือข่าย

ในรหัสตัวอธิบายไฟล์เป็นตัวแปรตัวชี้ไปยังบางสิ่งในเคอร์เนลซึ่งหมายถึงวัตถุไฟล์

ตัวอย่างเช่น / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 เป็นลิงค์ทั้งหมดไปยัง / dev / pts / 2 คำอธิบายไฟล์สี่ไฟล์นี้หรือชื่อไฟล์?

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

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