ความสามารถในการพกพาของลิงค์ไฟล์อธิบาย


20

ฉันสงสัยอยู่เสมอ แต่ไม่เคยใช้เวลาในการค้นหาดังนั้นฉันจะทำตอนนี้ - การใช้งานแบบพกพาแสดงได้อย่างไรจากที่นี่/proc/$$/fd/$Nหรือ /dev/fd/$Nฉันเข้าใจการรับประกัน POSIX /dev/null, /dev/tty, and /dev/console (แม้ว่าฉันจะพบว่าในวันอื่น ๆ หลังจากอ่านความคิดเห็นในคำตอบนี้ )แต่แล้วคนอื่น ๆ เหล่านี้ล่ะ?

เท่าที่ฉันสามารถบอกได้ว่าพวกเขาเป็นเรื่องธรรมดา แต่ในระบบใดที่ฉันไม่สามารถคาดหวังว่าจะพบพวกเขา ทำไมจะไม่ล่ะ? มีแนวโน้มที่จะพบหนึ่งมากกว่าอื่น ๆ ? พวกเขาจะแสดงเหมือนแอตทริบิวต์เสมอหรือไม่

ฉันมักจะใช้อุปกรณ์เหล่านี้อย่างกว้างขวางในทุกรูปแบบและฉันอยากจะรู้ว่าถ้ามีโอกาสฉันจะลองสั้น ๆ

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

คำตอบ:


27

symlinks เป็นกึ่งสากลบน Linux แต่พวกเขาไม่ได้อยู่ที่ใด (ยกเว้น Cygwin ซึ่ง emulates พวกเขา) ยังมีอยู่บน AIX และ Solaris แต่ไม่มีการเชื่อมโยง portably ที่จะได้รับข้อมูลเกี่ยวกับการเปิดไฟล์ที่ติดตั้ง/proc/PID/fd/NUM/proc/PID/fd/NUMlsof

พร้อมกับ /proc/PID/fd

ลินุกซ์

ภายใต้ Linux, การเชื่อมโยงสัญลักษณ์มายากลเล็กน้อยไปยังแฟ้มว่ากระบวนการที่มีรหัสPIDมีเปิดในไฟล์อธิบายNUM ลิงค์นี้เป็นเวทย์มนตร์ในนั้นตัวอย่างเช่นมันสามารถใช้ในการเข้าถึงไฟล์แม้ว่าไฟล์จะถูกลบออก ลิงก์จะติดตามไฟล์ผ่านการเปลี่ยนชื่อเช่นกัน เป็นลิงก์สัญลักษณ์วิเศษที่ชี้ไปที่ตำแหน่งPIDเป็นกระบวนการที่เข้าถึงลิงก์/proc/PID/fd/NUM/proc/self/proc/PID

คุณลักษณะนี้มีอยู่ในระบบ Linux เกือบทั้งหมด มันให้บริการโดยไดรเวอร์สำหรับระบบไฟล์ procซึ่งเป็นตัวเลือกทางเทคนิค แต่ใช้สำหรับหลายสิ่งหลายอย่าง (รวมถึงการpsทำงาน - มันอ่านจาก) ว่ามันแทบจะไม่เคยออกแม้ในระบบฝังตัว/proc/PID

Cygwin

Cygwin จำลองลินุกซ์(สำหรับกระบวนการ Cygwin) และ/proc/PID/fd/NUM/proc/self

Solaris (ตั้งแต่เวอร์ชัน 2.6), AIX

มีรายการสำหรับไฟล์ descriptor แต่ละตัว แต่ปรากฏเป็นชนิดเดียวกับไฟล์ที่เปิดดังนั้นจึงไม่มีข้อมูลเกี่ยวกับเส้นทางของไฟล์ อย่างไรก็ตามพวกเขาจะรายงานข้อมูลเดียวกับที่จะรายงานไปยังกระบวนการที่เปิดไฟล์ดังนั้นจึงเป็นไปได้ที่จะพิจารณาว่าระบบไฟล์ใดที่ไฟล์นั้นอยู่และหมายเลขไอโหนด ไดเรกทอรีที่ปรากฏเป็นลิงก์สัญลักษณ์อย่างไรก็ตามพวกเขาเป็น symlink มายากลที่สามารถติดตามได้และส่งกลับสตริงที่ว่างเปล่า/proc/PID/fdstatfstatreadlink

ภายใต้ AIX procfilesคำสั่งจะแสดงข้อมูลบางอย่างเกี่ยวกับไฟล์ที่เปิดของกระบวนการ ภายใต้ Solaris pfilesคำสั่งแสดงข้อมูลบางอย่างเกี่ยวกับไฟล์ที่เปิดของกระบวนการ สิ่งนี้ไม่รวมเส้นทางไปยังไฟล์ (บน Solaris มันทำตั้งแต่ Solaris 10 ดูด้านล่าง)

Solaris (ตั้งแต่รุ่น 10 )

นอกเหนือไปจากรุ่น Solaris ที่ทันสมัยมีซึ่งมีการเชื่อมโยงสัญลักษณ์คล้ายกับ symlinks ลินุกซ์ใน ข้อมูลคำสั่งเกี่ยวกับการแสดงให้เห็นว่าเป็นกระบวนการที่เปิดไฟล์รวมทั้งเส้นทาง/proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

แผน 9

/proc/PID/fdเป็นไฟล์ข้อความที่มีหนึ่งเร็กคอร์ด (บรรทัด) ต่อไฟล์ descriptor ที่เปิดโดยกระบวนการ ไม่มีการติดตามชื่อไฟล์

QNX

/proc/PID/ เป็นไดเรกทอรี แต่ไม่มีข้อมูลใด ๆ เกี่ยวกับตัวอธิบายไฟล์

คำสั่งที่มี/procแต่ไม่มีการเข้าถึงไฟล์ descriptors โดยตรง

(หมายเหตุ: บางครั้งเป็นไปได้ที่จะได้รับข้อมูลเกี่ยวกับไฟล์ที่เปิดของกระบวนการโดยการกระเพื่อมผ่านภาพหน่วยความจำซึ่งสามารถเข้าถึงได้ภายใต้/procฉันไม่นับว่าเป็น "การเข้าถึงโดยตรง")

Unices ที่เป็นไฟล์/proc/PID

ระบบไฟล์ proc นั้นเริ่มต้นในรุ่น UNIX 8th แต่มีโครงสร้างที่แตกต่างกันและผ่าน Plan 9 และกลับไปยัง unices ฉันคิดว่าระบบปฏิบัติการทั้งหมดที่มี a /procมีรายการสำหรับแต่ละ PID แต่ในหลาย ๆ ระบบมันเป็นไฟล์ปกติไม่ใช่ไดเรกทอรี ระบบต่อไปนี้มีสิ่งที่ต้องอ่านด้วย:/proc/PIDioctl

  • Solaris สูงถึง2.5
  • OSF / 1 เป็นที่รู้จักกันในนามTru64
  • IRIX (?)
  • SCO (?)

ขั้นต่ำ 3

MINIX 3 มีเซิร์ฟเวอร์ procfsซึ่งให้บริการส่วนประกอบเหมือน Linux หลายรายการรวมถึงไดเรกทอรี อย่างไรก็ตามสิ่งนี้ไม่มีเลย/proc/PID//proc/PID/fd

FreeBSD

FreeBSD มีไดเรกทอรี แต่พวกเขาไม่ได้ให้ข้อมูลเกี่ยวกับตัวอธิบายไฟล์แบบเปิด (อย่างไรก็ตามมีลักษณะคล้ายกับ Linux ให้การเข้าถึงไฟล์ที่เรียกทำงานได้ผ่านลิงก์สัญลักษณ์)/proc/PID//proc/PID/file/proc/PID/exe

procfs FreeBSD จะเลิก

โดยปราศจาก /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

ข้อมูลตัวให้คำอธิบายไฟล์ผ่านช่องทางอื่น

Fuser

fuserรายการคำสั่งกระบวนการที่มีการเปิดไฟล์ที่ระบุหรือไฟล์ที่เปิดอยู่บนที่ระบุจุดติด คำสั่งนี้เป็นมาตรฐาน (มีอยู่ในระบบที่สอดคล้องกับXSIทั้งหมดเช่น POSIX ที่มีส่วนขยายส่วนต่อประสานระบบ X / Open)

คุณไม่สามารถดำเนินการตามชื่อไฟล์จากยูทิลิตี้นี้ได้

lsof

Lsof ย่อมาจาก "list open files" มันเป็นเครื่องมือของบุคคลที่สามที่มีอยู่ (แต่มักจะไม่ได้เป็นส่วนหนึ่งของการติดตั้งเริ่มต้น) สำหรับตัวแปร Unix ส่วนใหญ่ การรับข้อมูลเกี่ยวกับไฟล์เปิดขึ้นอยู่กับระบบเป็นอย่างมากเนื่องจากการวิเคราะห์ข้างต้นอาจทำให้คุณสงสัย ผู้ดูแล lsof ได้ทำการทำงานของมันรวมทั้งหมดภายใต้อินเทอร์เฟซเดียว

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

Lsof ไม่สามารถรับส่วนประกอบชื่อพา ธ จากแคชชื่อเคอร์เนลของภาษาต่อไปนี้:

  • AIX

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

หากคุณต้องการวิเคราะห์ข้อมูลจากlsofเอาต์พุตให้แน่ใจว่าใช้-Fโหมด (หนึ่งฟิลด์ต่อบรรทัด) โดยเฉพาะ-F0โหมด (ฟิลด์ที่คั่นด้วย null) ที่จะได้รับข้อมูลเกี่ยวกับการอธิบายไฟล์ที่เฉพาะเจาะจงของกระบวนการที่เฉพาะเจาะจงให้ใช้-aตัวเลือกด้วยและเช่น-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM สำหรับ file descriptors ของกระบวนการปัจจุบัน

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

ในกรณีที่/dev/fdมีอยู่นอกจากนี้ยังมีมัก (เสมอ?) คำพ้องความหมาย (บางครั้งการเชื่อมโยงสัญลักษณ์บางครั้งเชื่อมโยงอย่างหนักบางครั้งไฟล์มายากลที่มีคุณสมบัติเทียบเท่า) /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, =/dev/stderr/dev/fd/2

  • ภายใต้ลินุกซ์คือการเชื่อมโยงสัญลักษณ์/dev/fd/proc/self/fd
  • ภายใต้ unices ส่วนใหญ่ ( IRIX , OpenBSD , NetBSD , SCO, Solaris , …) รายการใน/dev/fdเป็นอุปกรณ์อักขระ พวกเขามักจะปรากฏว่า file descriptor เปิดหรือไม่และรายการอาจไม่พร้อมใช้งานสำหรับ file descriptor ด้านบนจำนวนที่แน่นอน
  • ภายใต้ FreeBSD และ OSX ระบบไฟล์fdescfsจัดเตรียม/dev/fdไดเรกทอรีแบบไดนามิกซึ่งตามหลังตัวอธิบายแบบเปิดของกระบวนการเรียก ไม่ได้ติดตั้งแบบคงที่/dev/fdอยู่/dev/fd
  • ภายใต้ OSF / 1 (Tru64) /dev/fdให้บริการผ่านทางfdfs
  • ไม่มี/dev/fdบน AIX หรือ HP-UX

ข้อความของคุณเกี่ยวกับ Solaris นั้นล้าสมัยไปเล็กน้อย ด้วย Solaris รีลีสอายุน้อยกว่า 10 ปีpfilesคำสั่งจะแสดงพา ธ ของตัวให้คำอธิบายไฟล์ จะดึงข้อมูลนี้จาก/proc/<pid>/pathไดเรกทอรีที่คุณอาจพูดถึง ดูdocs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre

9

วิธีที่/procจะดำเนินการและคุณสมบัติที่จะให้ไม่ได้มาตรฐานในทางใดทางดูตัวอย่างที่นี่ ตามที่วิกิพีเดีย, FreeBSD คือ "ยุติการ" /procให้ดูที่นี่สำหรับรายละเอียด

ในฐานะของ/dev, /dev/fd/ไม่ได้เป็นส่วนหนึ่งของ POSIX หรือเดี่ยวผู้ใช้สเปกสินค้า (SUSv3) ในขณะที่ระบบวีและ BSD สนับสนุนมัน

ภาคผนวก:

ลินุกซ์: /dev/fd/*เป็น symlinks /proc/self/fdไป

FreeBSD: /dev/fd/*ให้บริการผ่าน fdescfs

NetBSD: เหมือนกับ FreeBSD

OpenBSD: เหมือนกับ FreeBSD

Solaris: /dev/fd/*มี

IRIX: /dev/fd/*มี

Tru64 Unix: /dev/fd/*ตามnixdoc.net , เอกสาร Tru64 ของแท้ที่ HP นั้นไม่อาจพิสูจน์ได้ (เด็กช่างเป็นระเบียบ!

AIX: ไม่พบสิ่งบ่งชี้จากเอกสารที่เปิดเผยต่อสาธารณะ

HP-UX: เช่นเดียวกับ AIX


ดังนั้นผมจึงจะพบ/dev/fd/1ใน BSD ที่เชื่อมโยงไปยังปัจจุบันของฉัน1>? สิ่งหนึ่งที่ฉันมักทำใน linux คือecho 'command' | . /dev/fd/0- สิ่งนี้มีแนวโน้มที่จะทำงานบนกระดานหรือเปล่าคุณคิดว่า?
mikeserv

ฉันไม่สามารถเข้าถึงระบบ BSD ได้ในขณะนี้ แต่นั่นเป็นวิธีที่ฉันเข้าใจใช่
ตอบโต้

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

ใช่. ฉันเดาว่าศ fd ปรากฏตัวขึ้นมาแล้วเหรอ? ดังนั้นโชคดีในครั้งต่อไปหรือไม่
mikeserv

1
เอาล่ะตอนนี้ Linux: / dev / fd / * เป็น symlinks ไปยัง / proc / self / fd FreeBSD: / dev / fd / * มีให้ผ่าน fdescfs NetBSD: เหมือนกับ FreeBSD OpenBSD: เหมือนกับ FreeBSD โซลาริส: มี / dev / fd / * IRIX: มี / dev / fd / * Tru64 Unix: มี / dev / fd / * (ตามnixdoc.net , เอกสาร Tru64 ของแท้ที่ HP นั้นไม่น่าเชื่อถือ) AIX: ไม่พบสิ่งบ่งชี้จากเอกสารที่เปิดเผยต่อสาธารณะ HP-UX: เช่นเดียวกับ AIX
ตอบโต้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.