unix โดเมนซ็อกเก็ต VS ชื่อไปป์?


122

หลังจากดูซ็อกเก็ตชื่อ unix และฉันคิดว่าพวกเขาชื่อไปป์ ฉันมองไปที่ท่อชื่อและไม่เห็นความแตกต่างมากนัก ฉันเห็นว่ามันเริ่มต้นแตกต่างกัน แต่นั่นเป็นสิ่งเดียวที่ฉันสังเกตเห็น ทั้งสองใช้ฟังก์ชันเขียน / อ่าน C และทำงานเหมือนกัน AFAIK

อะไรคือความแตกต่างระหว่างซ็อกเก็ตโดเมน unix และท่อที่มีชื่อ? เมื่อไหร่ที่ฉันจะเลือกอันอื่น? ฉันควรใช้ข้อใดเป็นค่าเริ่มต้น (เช่นฉันใช้เวกเตอร์โดยค่าเริ่มต้นใน C ++ มากกว่าใช้ deque รายการหรือสิ่งอื่นใดหากฉันต้องการ)

c  linux 

1
@GregHewgill: น่าเสียดายที่คำถามนั้นเกี่ยวกับ "IPC คืออะไร" มากกว่าความแตกต่างที่ฉันถาม: /. ฉันเห็นว่าก่อนโพสต์ฉันควรเชื่อมโยงและบอกว่าเกี่ยวข้องกันหรือไม่? (มันไม่มีประโยชน์สำหรับฉัน)

1
@acid: ใช่การเชื่อมโยงคำถามที่เกี่ยวข้องและอธิบายคำถามที่คุณยังมีอยู่ถือเป็นความคิดที่ดีเสมอ
Ben Voigt

3
บทความนี้สรุปได้ค่อนข้างดี Demystifying Unix Domain Sockets: thomasstover.com/uds.html
Cong Ma

ลิงก์เสีย: techdeviancy.com/uds.html
mcdado

คำตอบ:


106

ซ็อกเก็ต UNIX-domain โดยทั่วไปมีความยืดหยุ่นมากกว่าไปป์ที่มีชื่อ ข้อดีบางประการคือ:

  • คุณสามารถใช้กระบวนการเหล่านี้สำหรับกระบวนการสื่อสารมากกว่าสองกระบวนการ (เช่นกระบวนการเซิร์ฟเวอร์ที่มีการเชื่อมต่อกับกระบวนการไคลเอ็นต์หลายกระบวนการ)
  • เป็นแบบสองทิศทาง
  • สนับสนุนการส่งข้อมูลรับรอง UID / GID ที่ผ่านการยืนยันเคอร์เนลระหว่างกระบวนการต่างๆ
  • สนับสนุนการส่งไฟล์ descriptors ระหว่างกระบวนการ
  • รองรับแพ็คเก็ตและโหมดแพ็คเก็ตตามลำดับ

หากต้องการใช้หลายคุณสมบัติเหล่านี้คุณต้องใช้send()/ recv()ครอบครัวของสายระบบมากกว่า/write()read()


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

66

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

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


ท่อที่มีชื่ออยู่ในความเป็นจริงสองทิศทาง แต่ครึ่งเพล็กซ์ ซึ่งหมายความว่าการสื่อสารอาจเปลี่ยนจากจุดสิ้นสุด A ไปยังจุดสิ้นสุด B หรือ B ไปยัง A แต่จะทำทั้งสองอย่างไม่พร้อมกัน


1
อืมน่าสนใจ +1 คุณบังเอิญรู้หรือไม่ว่าความแตกต่างระหว่าง bytestream และ datagram คืออะไร? อาจจะเป็นตัวอย่างในประโยคหรือสองประโยคเหมือนที่คุณเคยทำมาแล้วสำหรับคำถามนี้?

7
@acidzombie: ไปป์หรือซ็อกเก็ตโหมดดาต้าแกรมจะรักษาขอบเขตเพื่อให้การwriteโทรหนึ่งครั้งสร้างการreadโทรหนึ่งครั้ง ในโหมดสตรีมข้อมูลสามารถเชื่อมต่อเข้าด้วยกันในสตรีมยาวเดียวดังนั้นจึงสามารถอ่านการเขียนจำนวนมากพร้อมกันหรือในทางกลับกัน (Windows มีท่อดาต้าแกรมตามคำตอบของ jtoberon Unix ไม่ได้)
Ben Voigt

1
@BenVoigt ดีการจัดส่งแพ็คเก็ตซ็อกเก็ตดาตาแกรมไม่น่าเชื่อถือดังนั้นการเขียนจึงไม่จำเป็นต้องสร้างการเรียกอ่าน อาจเป็นสำหรับซ็อกเก็ตในพื้นที่ แต่ไม่ชัดเจนจากความคิดเห็นของคุณ ดังนั้นไม่ว่ามันจะมีปัญหา
xaxxon

3
@xaxxon: ทั้งไพพ์และซ็อกเก็ตโดเมนยูนิกซ์เป็นแบบโลคัลดังนั้นตัวรับสัญญาณจึงล้างคิวของมันโดยไม่สูญเสีย
Ben Voigt

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