มีไฟล์สำหรับแต่ละซ็อกเก็ตหรือไม่?


21

"ทุกอย่างเป็นไฟล์" ใน UNIX World

ประโยคข้างต้นมีชื่อเสียง เมื่อฉันวิ่งecho "hello programmer" >> /dev/tty1ฉันสามารถดูสตริงที่กำหนดบนTeleType 1 , ....

ไฟล์แต่ละไฟล์คืออะไรและที่ไหนsocket? สมมติว่าเพื่อนของฉันเชื่อมต่อกับพีซีของฉันและ IP คือh.h.h.hฉันจะเข้าถึงไฟล์ที่เกี่ยวข้องได้อย่างไร มันเป็นไปได้?


3
ซ็อกเก็ต API เป็นจริงเบี่ยงเบนจากนโยบาย "ยูนิกซ์" ในเรื่องนี้เพราะมันเดิมมาจากBSD โปรดทราบว่ามีPlan 9เสมอจาก Bell Labsซึ่งเป็น "มากกว่า Unix มากกว่า Unix" - แม้แต่เครือข่ายและกราฟิก API ก็เป็นไฟล์ที่นั่น
ntoskrnl

ซ็อกเก็ตและกระบวนการต่าง ๆ ได้รับการกล่าวถึงในจำนวนที่พอใช้ในเอกสารแผน 9 ส่วนใหญ่พูดถึงว่าตัวแบบ UNIX ผิดพลาดที่ไหน
strugee

คำตอบ:


9

ผู้ชาย 7 unix:

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

นั่นคือไม่ใช่ทุกซ็อกเก็ตที่สามารถมองเห็นเป็นไฟล์ (ในแง่ของ "ไม่มีไฟล์โดยไม่มีชื่อไฟล์")

แต่มีไฟล์ที่มีรายการซ็อกเก็ต (เช่น/proc/net/tcp); ไม่ใช่สิ่งที่ "ทุกอย่างเป็นไฟล์" หมายถึง


38

ซ็อกเก็ตเป็นไฟล์ แต่ไม่ใช่ว่าทุกไฟล์จะมีชื่อ นี่คือตัวอย่างของไฟล์ที่ไม่มีชื่อ:

  • ไฟล์ใด ๆ ที่เคยมีชื่อและถูกลบไปแล้ว แต่ยังคงเปิดอยู่โดยโปรแกรม
  • ไม่มีชื่อท่อเช่นหนึ่งที่สร้างขึ้นโดย|ผู้ประกอบการเชลล์
  • ซ็อกเก็ตส่วนใหญ่: ซ็อกเก็ตอินเทอร์เน็ตใด ๆหรือซ็อกเก็ต Unixซึ่งไม่ได้อยู่ในระบบแฟ้มเนมสเปซ (สามารถอยู่ในบทคัดย่อเนมสเปซหรือไม่มีชื่อ)

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

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


นี่คือคำตอบที่ถูกต้อง
jforberg

4
/proc/<pid>/fd/*และ/proc/net/*อาจน่าสนใจ
n611x007

โปรดยอมรับคำตอบนี้ IMHO นั้นแม่นยำกว่ามาก
user1202136

13

ไฟล์ต่อซ็อกเก็ตแต่ละไฟล์คืออะไรและอยู่ที่ไหน

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

ดังที่ Hauke ​​Laging กล่าวถึงซ็อกเก็ต "unix local"มีโหนดไฟล์เช่นเดียวกับชื่อ pipes (ดูman fifo) อย่างไรก็ตามซ็อกเก็ตอินเทอร์เน็ตโปรโตคอล (ใช้สำหรับการสื่อสารเครือข่าย) ไม่ได้ แต่จะเชื่อมโยงใน userspace ด้วยหมายเลขพอร์ตแทน โปรดสังเกตว่าซ็อกเก็ตเซิร์ฟเวอร์บนพอร์ตเดียวเชื่อมต่อไคลเอ็นต์หลายไคลเอ็นต์แต่ละซ็อกเก็ตของตนเอง (ไฟล์ซ็อกเก็ตยูนิกซ์เดียวสามารถใช้วิธีนี้กับเซิร์ฟเวอร์หมายความว่าอาจมีหลายซ็อกเก็ตที่เชื่อมโยงกับที่อยู่ไฟล์เดียวกัน) และในรหัสพวกเขาจะถูกระบุเป็นรายบุคคลผ่านตัวอธิบายไฟล์ตัวเลขแยกต่างหาก

ดังนั้นในแง่นั้นซ็อกเก็ตทั้งหมดเป็นเหมือนไฟล์และมีลิงค์/proc/[pid]/fd/มา คุณสามารถเรียกreadlink()ใช้ไอโหนดนี้และรับชื่อไฟล์พิเศษซึ่งใช้ในเครื่องมือบรรทัดคำสั่งเช่นlsofฉันเชื่อ fstat()เช่นเดียวกันคุณจะได้รับข้อมูลเกี่ยวกับซ็อกเก็ตบ่งผ่าน


คุณหมายถึง "ระบุไว้ใน userspace โดย inode ของพวกเขา"? ไม่ใช่ทุกซ็อกเก็ตที่มีหมายเลขพอร์ตและอาจมีหลายซ็อกเก็ตสำหรับหมายเลขพอร์ตเดียวกัน (ไม่สมเหตุสมผล)
Hauke ​​Laging

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