คำอธิบายไฟล์คืออะไรอธิบายด้วยคำง่ายๆ


383
  1. อะไรจะเป็นคำอธิบายที่ง่ายขึ้นของ file descriptors เทียบกับ Wikipedia ทำไมพวกเขาต้องการ? สมมติว่าใช้กระบวนการเชลล์เป็นตัวอย่างและนำไปใช้อย่างไร

  2. ตารางกระบวนการมีตัวอธิบายไฟล์มากกว่าหนึ่งไฟล์หรือไม่ ถ้าใช่ทำไม


3
แล้วแนวคิดของ stdin stdout stderr ฯลฯ ล่ะ? ฉันมีอินสแตนซ์พูดว่ากระบวนการของเบราว์เซอร์เปิดขึ้นและได้เปิดไฟล์ชั่วคราวบางไฟล์เพื่อแสดง html ของฉัน กระบวนการใช้ fd เดียวกันเพื่ออ่าน / เขียน? ตารางกระบวนการ ....... ก็มีรายการเช่น fd0 pointer fd1 pointer fd2 pointer นั่นหมายความว่าไฟล์ทั้งหมดเหล่านี้อยู่ใน RAM หรือไม่? ทำไมตัวชี้อื่น
Nishant

43
เมื่อคุณเปิดไฟล์ระบบปฏิบัติการจะสร้างสตรีมไปยังไฟล์นั้นและเชื่อมต่อสตรีมนั้นกับไฟล์ที่เปิดตัวบอกความจริงหมายถึงสตรีมนั้น ในทำนองเดียวกันมีสตรีมเริ่มต้นบางส่วนที่สร้างขึ้นโดยระบบปฏิบัติการ สตรีมเหล่านี้เชื่อมต่อกับเทอร์มินัลของคุณแทนไฟล์ ดังนั้นเมื่อคุณเขียนบางอย่างในเทอร์มินัลมันจะไปที่ stdin stream และ OS และเมื่อคุณเขียนคำสั่ง "ls" บนเทอร์มินัลระบบปฏิบัติการจะเขียนเอาต์พุตไปยัง stdout stream สตรีม stdout เชื่อมต่อกับจอมอนิเตอร์ของคุณเพื่อให้คุณสามารถเห็นผลลัพธ์ที่นั่น
Tayyab

1
เกี่ยวกับตัวอย่างของเบราว์เซอร์ไม่จำเป็นที่เบราว์เซอร์จะเปิดไฟล์ ขึ้นอยู่กับการนำเบราว์เซอร์มาใช้ แต่ส่วนใหญ่เบราว์เซอร์จะเปิดไฟล์ชั่วคราวเขียนไฟล์และปิดไฟล์ดังนั้นจึงไม่จำเป็นที่ไฟล์จะถูกเปิดแม้ว่าหน้าเว็บจะเปิดอยู่ก็ตาม และ descriptor จะเก็บข้อมูลของไฟล์และไม่จำเป็นต้องเก็บไฟล์ไว้ใน RAM เมื่อคุณอ่านข้อมูลจาก descriptor ระบบปฏิบัติการจะอ่านข้อมูลจากฮาร์ดดิสก์ ข้อมูลในไฟล์อธิบายเพียงหมายถึงสถานที่ตั้งของไฟล์บนฮาร์ดดิสก์ ฯลฯ ..
Tayyab

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

7
นี่คือเรื่องที่ดีที่จะเข้าใจมันได้อย่างง่ายดายbottomupcs.com/file_descriptors.xhtml
Krishan โกปาล

คำตอบ:


561

คำง่ายๆเมื่อคุณเปิดไฟล์ระบบปฏิบัติการจะสร้างรายการเพื่อแสดงไฟล์นั้นและเก็บข้อมูลเกี่ยวกับไฟล์ที่เปิดนั้น ดังนั้นหากมี 100 ไฟล์ที่เปิดในระบบปฏิบัติการของคุณจะมี 100 รายการในระบบปฏิบัติการ (ที่ใดที่หนึ่งในเคอร์เนล) รายการเหล่านี้แสดงเป็นจำนวนเต็มเช่น (... 100, 101, 102 .... ) หมายเลขรายการนี้เป็น file descriptor ดังนั้นมันจึงเป็นเพียงตัวเลขจำนวนเต็มที่แสดงถึงไฟล์ที่เปิดในระบบปฏิบัติการ หากกระบวนการของคุณเปิด 10 ไฟล์ตารางกระบวนการของคุณจะมี 10 รายการสำหรับตัวอธิบายไฟล์

ในทำนองเดียวกันเมื่อคุณเปิดซ็อกเก็ตเครือข่ายมันจะถูกแทนด้วยจำนวนเต็มและเรียกว่า Socket Descriptor ฉันหวังว่าคุณเข้าใจ.


7
และนี่คือเหตุผลที่คุณสามารถเรียกใช้ตัวให้คำอธิบายไฟล์หมดหากคุณเปิดไฟล์จำนวนมากพร้อมกัน ซึ่งจะป้องกันไม่ให้ระบบ * nix ทำงานเนื่องจากจะเปิดตัวอธิบายไปยังเนื้อหา/procตลอดเวลา
Spencer Rathbun

8
@ErbenMo: ไม่มันอาจจะไม่เหมือนกัน เมื่อคุณเปิดไฟล์ระบบปฏิบัติการจะกำหนด FD ที่พร้อมใช้งานและเมื่อคุณปิดมัน OS จะปล่อย FD และอาจกำหนด FD นั้นให้กับไฟล์อื่นที่เปิดหลังจากนั้น ระบบปฏิบัติการเป็นวิธีในการติดตามไฟล์ที่เปิดและไม่มีส่วนเกี่ยวข้องกับไฟล์ใดไฟล์หนึ่ง
Tayyab

49
" ดังนั้นมันเป็นเพียงตัวเลขจำนวนเต็มที่แสดงถึงไฟล์ที่เปิดในระบบปฏิบัติการโดยเฉพาะ " สิ่งนี้ไม่ถูกต้อง จำนวนเต็มที่ไม่ซ้ำกันหมายถึงไฟล์ที่เปิดภายในกระบวนการ ตัวอย่างเช่น File descriptor 0 จะแสดงไฟล์ที่เปิดหนึ่งไฟล์ในกระบวนการหนึ่งและไฟล์เปิดที่แตกต่างอย่างสิ้นเชิงในกระบวนการอื่น
Keith Thompson

15
@Tayyab: ฉันเชื่อว่าคุณเข้าใจผิด ตัวอธิบายไฟล์ 0, 1 และ 2 คืออินพุตมาตรฐานเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานสำหรับแต่ละกระบวนการที่กำลังรัน การเรียกใช้ครั้งแรกที่ประสบความสำเร็จopen()จะให้ไฟล์ descriptor 3 แก่คุณแม้ว่ากระบวนการที่กำลังรันอื่นจะมีไฟล์ descriptor 3 ดูคำนิยาม POSIX ของopen() : "ฟังก์ชั่น open () จะส่งคืน descriptor ไฟล์สำหรับไฟล์ที่ระบุชื่อที่ต่ำที่สุด ไฟล์ descriptor ที่ยังไม่เปิดสำหรับกระบวนการนั้น " (เน้นที่เพิ่ม)
Keith Thompson

17
@ KeithThompson: ใช่คุณพูดถูก จริงๆแล้วมันเกี่ยวกับระดับของสิ่งที่เป็นนามธรรม ที่จริงแล้วมีการบำรุงรักษาตารางสองตารางโดยที่หนึ่งรายการแรกสำหรับแต่ละกระบวนการและตารางที่สองคือกว้างของระบบ FD ในตารางต่อกระบวนการ (เช่น fdtable) ไม่ใช่ความกว้างของระบบที่ไม่ซ้ำกัน อย่างไรก็ตามแม็พกับตาราง v-node ที่มีรายการเฉพาะของระบบ ดังนั้นเมื่อคุณเรียกใช้ฟังก์ชัน fopen () และ fileno () เพื่อตรวจสอบ descriptor คุณจะได้รับหมายเลข FD เดียวกันใน 2 กระบวนการที่แตกต่างกันเพราะมันจะส่งคืนดัชนีของ fdtable ซึ่งเป็นกระบวนการต่อกระบวนการ ขอบคุณที่นำมันมา !!
Tayyab

116

file descriptor เป็นตัวจัดการทึบแสงที่ใช้ในอินเตอร์เฟสระหว่างผู้ใช้และพื้นที่เคอร์เนลเพื่อระบุทรัพยากรของไฟล์ / ซ็อกเก็ต ดังนั้นเมื่อคุณใช้open()หรือsocket()(การเรียกระบบเพื่อเชื่อมต่อกับเคอร์เนล) คุณจะได้รับ file descriptor ซึ่งเป็นจำนวนเต็ม (จริง ๆ แล้วเป็นดัชนีในโครงสร้างกระบวนการ u - แต่นั่นไม่สำคัญ) ดังนั้นถ้าคุณต้องการที่จะติดต่อโดยตรงกับเคอร์เนลโดยใช้สายระบบเพื่อread(), write(), close()ฯลฯ จับที่คุณใช้เป็นอธิบายไฟล์

มีเลเยอร์ของ abstraction ที่ซ้อนทับบนการเรียกของระบบซึ่งเป็นstdioอินเตอร์เฟส สิ่งนี้มีฟังก์ชั่น / คุณสมบัติมากกว่าการเรียกระบบพื้นฐาน สำหรับอินเตอร์เฟสนี้ตัวจัดการทึบแสงที่คุณได้รับคือ a FILE*ซึ่งถูกส่งคืนโดยการfopen()โทร มีฟังก์ชั่นหลายที่ใช้เป็นstdioอินเตอร์เฟซfprintf(), fscanf(), fclose()ซึ่งจะมีที่จะทำให้ชีวิตของคุณง่ายขึ้น ใน C, stdin, stdoutและstderrมีFILE*ซึ่งในยูนิกซ์ตามลำดับ map เพื่ออธิบายไฟล์0, และ12


6
โดยส่วนตัวฉันคิดว่าคำตอบนี้ดีกว่าคำตอบที่ทำเครื่องหมายว่าเป็นคำตอบ upvoted
Tarik

101

ได้ยินจากปากม้า: APUE (Richard Stevens)
ไปที่เคอร์เนลไฟล์ที่เปิดทั้งหมดถูกอ้างถึงโดย File Descriptors file descriptor เป็นจำนวนที่ไม่เป็นลบ

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

สองกระบวนการ

เมื่อเราต้องการที่จะอ่านหรือเขียนไฟล์ที่เราระบุไฟล์ที่มีการอธิบายไฟล์ที่ถูกส่งกลับโดยเปิด ()หรือสร้าง ()ฟังก์ชั่นและใช้เป็นอาร์กิวเมนต์ทั้งอ่าน ()หรือเขียน ()
มันเป็นโดยการประชุมที่ระบบ UNIX หอย บริษัท ร่วมอธิบายไฟล์ 0 พร้อมด้วยเข้ามาตรฐานของกระบวนการ, ไฟล์อธิบาย 1 ออกมาตรฐานและไฟล์อธิบาย 2 กับข้อผิดพลาดมาตรฐาน
ตัวอธิบายไฟล์มีช่วงตั้งแต่ 0 ถึง OPEN_MAX ulimit -nไฟล์อธิบายค่าสูงสุดสามารถรับกับ สำหรับข้อมูลเพิ่มเติมให้อ่านบทที่ 3 ของ APUE Book


1
ตั้งแต่ 0, 1, 2 เกี่ยวข้องกับ "stdin", "stdout" และ "stderr" ของกระบวนการเราสามารถใช้ตัวอธิบายเหล่านั้นพร้อมกันสำหรับกระบวนการที่แตกต่างกันได้หรือไม่
Tarik

@Tarik: ตัวอธิบายไฟล์เป็นต่อกระบวนการ หากต้องการดูสิ่งนี้ดาวน์โหลดosqueryและดำเนินการosqueryi <<< echo '.all process_open_files'ใน bash shell
Ben Creasy

29

คำตอบอื่น ๆ เพิ่มสิ่งที่ดี ฉันจะเพิ่มเพียง 2 เซ็นต์ของฉัน

จากวิกิพีเดียเรารู้แน่ชัดว่า file descriptor เป็นจำนวนเต็มไม่เป็นลบ สิ่งที่สำคัญที่สุดที่ฉันคิดว่าขาดหายไปคือ:

ตัวอธิบายไฟล์ถูกผูกไว้กับ ID กระบวนการ

เรารู้ว่าส่วนใหญ่อธิบายไฟล์ที่มีชื่อเสียงเป็น 0, 1 และ 2 0 สอดคล้องกับSTDIN1 ถึงSTDOUTและ STDERR2

สมมติว่าใช้กระบวนการเชลล์เป็นตัวอย่างและนำไปใช้อย่างไร

ลองดูรหัสนี้

#>sleep 1000 &
[12] 14726

เราสร้างกระบวนการด้วย id 14726 (PID) ใช้lsof -p 14726เราสามารถได้รับสิ่งนี้:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   14726 root  cwd    DIR    8,1     4096 1201140 /home/x
sleep   14726 root  rtd    DIR    8,1     4096       2 /
sleep   14726 root  txt    REG    8,1    35000  786587 /bin/sleep
sleep   14726 root  mem    REG    8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep   14726 root  mem    REG    8,1  2030544  137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep   14726 root  mem    REG    8,1   170960  137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

คอลัมน์ 4-th FD และคอลัมน์ถัดไป TYPE สอดคล้องกับ File Descriptor และ File Descriptor type

ค่าบางอย่างสำหรับ FD อาจเป็น:

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device

แต่ตัวอธิบายไฟล์จริงอยู่ภายใต้:

NUMBER – Represent the actual file descriptor. 

อักขระหลังตัวเลขคือ "1u" หมายถึงโหมดที่เปิดไฟล์ r สำหรับการอ่าน, w สำหรับการเขียน, u สำหรับการอ่านและการเขียน

TYPE ระบุประเภทของไฟล์ บางส่วนของค่าของ TYPEs คือ:

REG – Regular File
DIR – Directory
FIFO – First In First Out

แต่ตัวอธิบายไฟล์ทั้งหมดเป็น CHR - ไฟล์พิเศษของตัวละคร (หรือไฟล์อุปกรณ์ตัวอักษร)

ตอนนี้เราสามารถระบุอธิบายไฟล์สำหรับSTDIN, STDOUTและSTDERRง่ายด้วยหรือเราสามารถมองเห็นเหมือนกันถ้าเราlsof -p PIDls /proc/PID/fd

โปรดสังเกตว่าตาราง descriptor ไฟล์ที่เคอร์เนลติดตามไม่เหมือนกับตารางไฟล์หรือตาราง inodes เหล่านี้แยกต่างหากตามคำตอบอื่น ๆ อธิบาย

ตาราง fd

คุณอาจจะถามตัวเองที่เหล่านี้อธิบายไฟล์ทางร่างกายและสิ่งที่ถูกเก็บไว้ใน/dev/pts/6ตัวอย่างเช่น

sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

ดี/dev/pts/6อยู่ในความทรงจำอย่างหมดจด เหล่านี้ไม่ได้ไฟล์ปกติ แต่เรียกว่าแฟ้มอุปกรณ์ตัวอักษร คุณสามารถตรวจสอบเรื่องนี้ด้วย: ls -l /dev/pts/6และพวกเขาจะเริ่มต้นด้วยในกรณีของฉันccrw--w----

เพียงเพื่อระลึกถึง Linux ส่วนใหญ่เช่น OS กำหนดไฟล์เจ็ดประเภท:

  • ไฟล์ปกติ
  • ไดเรกทอรี
  • ไฟล์อุปกรณ์ตัวละคร
  • บล็อกไฟล์อุปกรณ์
  • ซ็อกเก็ตโดเมนท้องถิ่น
  • ไปป์ที่มีชื่อ (FIFO) และ
  • ลิงก์สัญลักษณ์

1
ขอบคุณ แน่นอนมันเป็นสิ่งสำคัญที่จะชี้ให้เห็นว่ามันเป็นกระบวนการต่อ! ช่วยให้มองเห็นสิ่งต่าง ๆ ได้ดีขึ้น
Nishant

1
ประเภทของไฟล์ที่กำหนดโดยระบบปฏิบัติการที่คุณพูดถึงในคำตอบของคุณช่วยจริงๆในการทำความเข้าใจไฟล์ในระดับที่ต่ำกว่า
Rohan Bhale

20

จุดเพิ่มเติมเกี่ยวกับFile Descriptor:

  1. File Descriptors(FD) เป็นจำนวนเต็มที่ไม่เป็นลบ(0, 1, 2, ...)ที่เกี่ยวข้องกับไฟล์ที่เปิด

  2. 0, 1, 2เป็นมาตรฐานFD 's สอดคล้องกับที่STDIN_FILENO, STDOUT_FILENOและSTDERR_FILENO(ที่กำหนดไว้ในunistd.h) เปิดได้โดยเริ่มต้นในนามของเปลือกเมื่อโปรแกรมเริ่มต้น

  3. FD ถูกจัดสรรตามลำดับซึ่งหมายถึงค่าจำนวนเต็มที่ไม่ได้ถูกจัดสรรต่ำสุดที่เป็นไปได้

  4. FD ของกระบวนการเฉพาะสามารถดูได้ใน/proc/$pid/fd(บนระบบที่ใช้ Unix)


16

นอกเหนือจากคำตอบอื่น ๆ แล้วยูนิกซ์ก็ถือว่าทุกสิ่งเป็นระบบไฟล์ แป้นพิมพ์ของคุณเป็นไฟล์ที่อ่านได้จากมุมมองของเคอร์เนลเท่านั้น หน้าจอเป็นไฟล์เขียนอย่างเดียว ในทำนองเดียวกันโฟลเดอร์อุปกรณ์อินพุต - เอาท์พุตและอื่น ๆ ก็ถือว่าเป็นไฟล์เช่นกัน เมื่อใดก็ตามที่ไฟล์ถูกเปิดให้บอกว่าเมื่อไดรเวอร์อุปกรณ์ [สำหรับไฟล์อุปกรณ์] ร้องขอ open () หรือกระบวนการเปิดไฟล์ผู้ใช้เคอร์เนลจะจัดสรร file descriptor เป็นจำนวนเต็มที่ระบุการเข้าถึงไฟล์นั้นซึ่งเป็นการอ่านอย่างเดียว เขียนเท่านั้นเป็นต้น [สำหรับการอ้างอิง: https://en.wikipedia.org/wiki/Everything_is_a_file ]


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

12

ตัวอธิบายไฟล์ (FD):

  • ในLinux / Unixทุกอย่างเป็นไฟล์ ไฟล์ปกติ Directories และแม้กระทั่ง Devices คือไฟล์ ทุกไฟล์มีหมายเลขที่เกี่ยวข้องที่เรียกว่า File Descriptor (FD)
  • หน้าจอของคุณมี File Descriptor ด้วย เมื่อโปรแกรมถูกดำเนินการเอาต์พุตจะถูกส่งไปยัง File Descriptor ของหน้าจอและคุณจะเห็นผลลัพธ์ของโปรแกรมบนจอภาพของคุณ หากเอาต์พุตถูกส่งไปยัง File Descriptor ของเครื่องพิมพ์เอาต์พุตของโปรแกรมจะถูกพิมพ์

    การเปลี่ยนเส้นทางข้อผิดพลาด:
    เมื่อใดก็ตามที่คุณรันโปรแกรม / คำสั่งที่เทอร์มินัลไฟล์ 3 ไฟล์จะเปิดอยู่เสมอ
    1. อินพุตมาตรฐาน
    2. เอาต์พุตมาตรฐาน
    3. มาตรฐานบกพร่อง.

    ไฟล์เหล่านี้มักจะปรากฏเมื่อใดก็ตามที่มีการเรียกใช้โปรแกรม ดังที่อธิบายไว้ก่อนตัวอธิบายไฟล์เกี่ยวข้องกับไฟล์เหล่านี้แต่ละไฟล์
    ไฟล์ตัว                                        อธิบายไฟล์
    อินพุตมาตรฐาน STDIN 0
    เอาต์พุตมาตรฐาน STDOUT 1
    ข้อผิดพลาดมาตรฐาน STDERR 2

  • ตัวอย่างเช่นในขณะที่ค้นหาไฟล์หนึ่งมักจะได้รับอนุญาตปฏิเสธข้อผิดพลาดหรือข้อผิดพลาดชนิดอื่น ๆ ข้อผิดพลาดเหล่านี้สามารถบันทึกเป็นไฟล์โดยเฉพาะ
    ตัวอย่างที่ 1

$ ls mydir 2> errorsfile.txt

file descriptor สำหรับข้อผิดพลาดมาตรฐานคือ 2
หากไม่มีไดเร็กทอรีใดที่ชื่อเป็น mydir ดังนั้นเอาต์พุตของคำสั่งจะถูกบันทึกลงในไฟล์ errorfile.txt
โดยใช้ "2>" เราจะส่งเอาต์พุตข้อผิดพลาดไปยังไฟล์ชื่อ "errorfile อีกครั้ง txt "
ดังนั้นผลลัพธ์ของโปรแกรมจะไม่ยุ่งเหยิงกับข้อผิดพลาด

ฉันหวังว่าคุณจะได้คำตอบของคุณ


5

ระบบปฏิบัติการใด ๆ ที่มีกระบวนการ (p's) กำลังทำงานอยู่พูดp1, p2, p3และอื่น ๆ แต่ละกระบวนการมักจะใช้งานไฟล์อย่างต่อเนื่อง

แต่ละกระบวนการประกอบด้วยแผนผังกระบวนการ (หรือตารางกระบวนการในการใช้ถ้อยคำอื่น)

โดยทั่วไประบบปฏิบัติการจะแสดงแต่ละไฟล์ในแต่ละกระบวนการด้วยตัวเลข (กล่าวคือในแต่ละทรี / ตาราง)

ไฟล์แรกที่ใช้ในกระบวนการคือfile0ที่สองคือfile1ที่สามคือfile2และอื่น ๆ

หมายเลขใด ๆ ดังกล่าวเป็นไฟล์อธิบาย

ตัวอธิบายไฟล์มักเป็นจำนวนเต็ม (0, 1, 2 และไม่ใช่ 0.5, 1.5, 2.5)

เนื่องจากเรามักจะอธิบายกระบวนการต่าง ๆ ว่า "process-tables" และเนื่องจากตารางนั้นมีแถว (รายการ) เราสามารถพูดได้ว่าเซลล์ descriptor ของไฟล์ในแต่ละรายการใช้เพื่อแสดงรายการทั้งหมด

ในทำนองเดียวกันเมื่อคุณเปิดซ็อกเก็ตเครือข่ายจะมีตัวบ่งชี้ซ็อกเก็ต

ในระบบปฏิบัติการบางระบบคุณสามารถใช้ตัวให้คำอธิบายไฟล์หมด แต่กรณีเช่นนี้หายากมากและผู้ใช้คอมพิวเตอร์โดยเฉลี่ยไม่ควรกังวล

ตัวอธิบายไฟล์อาจเป็นแบบโกลบอล (กระบวนการ A เริ่มต้นในการพูด 0 และสิ้นสุดการพูดใน 1; โพรเซส B เริ่มพูดใน 2 และลงท้ายด้วย 3) และอื่น ๆ แต่เท่าที่ฉันรู้มักจะอยู่ในระบบปฏิบัติการสมัยใหม่ descriptors ไม่ใช่ global และแท้จริงแล้วเป็นกระบวนการเฉพาะ (กระบวนการ A เริ่มด้วย 0 และสิ้นสุดพูดใน 5 ในขณะที่กระบวนการ B เริ่มใน 0 และสิ้นสุดพูดใน 10)


อ่านเพิ่มเติมเกี่ยวกับ FD's ใน Linux ได้ที่นี่: unix.stackexchange.com/questions/358022/…

1
คำตอบที่ดี :)
humble_wolf

5

อธิบายไฟล์

  • ไปที่เคอร์เนลไฟล์ที่เปิดอยู่ทั้งหมดถูกอ้างถึงโดย file descriptors
  • file descriptor เป็นจำนวนเต็มที่ไม่เป็นลบ
  • เมื่อเราเปิดไฟล์ที่มีอยู่หรือสร้างไฟล์ใหม่เคอร์เนลจะส่งคืนไฟล์ descriptor ไปยังโปรเซส
  • เมื่อเราต้องการอ่านหรือเขียนไฟล์เราจะระบุไฟล์ที่มี file descriptor ที่ retuned โดยเปิดหรือสร้างเป็นอาร์กิวเมนต์สำหรับอ่านหรือเขียน
  • แต่ละกระบวนการของ UNIX จะมีตัวอธิบายไฟล์ 20 ตัวและจะทำการกำจัดโดยมีหมายเลข 0 ถึง 19 แต่ถูกขยายเป็น 63 โดยหลายระบบ
  • สามตัวแรกจะเปิดขึ้นเมื่อกระบวนการเริ่มต้น 0: อินพุตมาตรฐาน 1: เอาต์พุตมาตรฐาน 2: เอาต์พุตข้อผิดพลาดมาตรฐาน
  • เมื่อกระบวนการพาเรนต์ใช้กระบวนการกระบวนการลูกจะสืบทอดไฟล์ descriptors ของพาเรนต์

1

นอกเหนือจากข้างต้นแล้วคำตอบที่ง่ายขึ้นทั้งหมด
หากคุณกำลังทำงานกับไฟล์ในสคริปต์ทุบตีมันจะดีกว่าที่จะใช้ตัวอธิบายไฟล์
ตัวอย่างเช่น: -
คุณต้องการอ่านและเขียนจาก / ถึงไฟล์ "test.txt"
ใช้ไฟล์ descriptor ดังแสดงด้านล่าง

FILE=$1 # give the name of file in the command line
exec 5<>$FILE # '5' here act as the file descriptor
# Reading from the file line by line using file descriptor
while read LINE; do
    echo "$LINE"
done <&5

# Writing to the file using descriptor
echo "Adding the date: `date`" >&5 
exec 5<&- # Closing a file descriptor

-5

File Descriptors เป็น descriptor ของไฟล์ พวกเขาให้ลิงค์ไปยังไฟล์ ด้วยความช่วยเหลือของพวกเขาเราสามารถอ่านเขียนและเปิดไฟล์

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