यूनिक्स डोमेन सॉकेट बनाम पाइप का नाम?


122

सॉकेट नाम के एक यूनिक्स को देखने के बाद और मुझे लगा कि उन्हें पाइप का नाम दिया गया है। मैंने नाम के पाइप को देखा और बहुत अंतर नहीं देखा। मैंने देखा कि उन्हें अलग-अलग तरह से इनिशियलाइज़ किया गया था, लेकिन एक ही चीज़ मुझे नज़र आती है। दोनों C लिखने / पढ़ने के कार्य और काम को समान रूप से उपयोग करते हैं।

यूनिक्स डोमेन सॉकेट और नामित पाइप के बीच अंतर क्या है? मैं कब एक को उठाऊंगा? मुझे डिफ़ॉल्ट रूप से उपयोग करना चाहिए (जैसे कि मैं C ++ में डिफ़ॉल्ट रूप से सदिश का उपयोग कैसे करता हूं?

c  linux 

1
@GregHewgill: दुर्भाग्य से वह प्रश्न "IPC क्या है" के बजाय मैं जो पूछ रहा हूं, उससे कहीं अधिक है: /। मैंने देखा कि पोस्ट करने से पहले, क्या मुझे इससे संबंधित और कहा जाना चाहिए था? (यह मेरे लिए उपयोगी नहीं था)

1
@acid: हाँ, संबंधित प्रश्नों को जोड़ना और यह बताना कि आपके पास अभी भी कौन सा प्रश्न है, हमेशा एक अच्छा विचार है।
बेन Voigt

3
यह लेख बहुत अच्छी तरह से संक्षेप में प्रस्तुत किया। Unix डोमेन सॉकेट्स को तोड़ना
Cong Ma

टूटी लिंक: techdeviancy.com/uds.html
mcdado 17

जवाबों:


106

UNIX- डोमेन सॉकेट आमतौर पर नामित पाइपों की तुलना में अधिक लचीले होते हैं। उनके कुछ फायदे हैं:

  • आप उन्हें दो से अधिक प्रक्रियाओं के लिए उपयोग कर सकते हैं (उदाहरण के लिए, संभावित एकाधिक क्लाइंट प्रक्रियाओं को जोड़ने वाली एक सर्वर प्रक्रिया);
  • वे द्विदिश हैं;
  • वे प्रक्रियाओं के बीच कर्नेल-सत्यापित UID / GID क्रेडेंशियल पास करने का समर्थन करते हैं;
  • वे प्रक्रियाओं के बीच फ़ाइल डिस्क्रिप्टर पास करने का समर्थन करते हैं;
  • वे पैकेट और अनुक्रमित पैकेट मोड का समर्थन करते हैं।

इन सुविधाओं में से कई का उपयोग करने के लिए, आप का उपयोग करने की आवश्यकता है send()/ recv()सिस्टम कॉल के बजाय के परिवार write()/ read()


11
दूसरी ओर, शायद यह कहा जाना चाहिए कि नाम पाइपों में यह फायदा है कि वे साधारण open(2)कॉल के माध्यम से "कनेक्ट" हो सकते हैं, जो उन्हें उन कार्यक्रमों के बीच तदर्थ पाइपलाइनों के निर्माण के लिए अधिक अच्छी तरह से अनुकूल बनाते हैं जो आम तौर पर केवल फ़ाइल नाम की दलीलें लेते हैं।
डोडा २२

66

एक अंतर यह है कि नामित पाइप एक तरफ़ा हैं, इसलिए आपको दो तरफ़ा संचार करने के लिए उनमें से दो का उपयोग करना होगा। कोर्स की कुर्सियां ​​दो तरह से हैं। यह एक के बजाय दो चर का उपयोग करने के लिए थोड़ा अधिक जटिल लगता है (यानी, एक सॉकेट के बजाय दो पाइप)।

इसके अलावा, विकिपीडिया लेख निम्नलिखित बिंदु पर बहुत स्पष्ट है : "यूनिक्स डोमेन सॉकेट बाइट स्ट्रीम या डेटाग्राम अनुक्रम के रूप में बनाए जा सकते हैं, जबकि पाइप केवल बाइट स्ट्रीम हैं।"


नामांकित पाइप, वास्तव में, द्वि-दिशात्मक लेकिन आधे-द्वैध हैं । इसका मतलब है कि संचार या तो अंत ए से अंत बी, या बी से ए तक जा सकता है, लेकिन कभी भी दोनों एक ही समय में नहीं होते हैं।


1
हम्म दिलचस्प 1। क्या आप संयोग से जानते हैं कि क्या अंतर bytestream और datagram के बीच है? शायद एक उदाहरण में या दो जैसे कि आपने पहले ही इस प्रश्न के लिए किया था?

7
@acidzombie: डेटाग्राम-मोड पाइप या सॉकेट सीमाओं को बनाए रखता है, जिससे एक writeकॉल एक कॉल का उत्पादन करता है read। स्ट्रीम-मोड में डेटा को एक लंबी स्ट्रीम में एक साथ समेटा जा सकता है, इसलिए कई राइट्स को एक बार में पढ़ा जा सकता है, या इसके विपरीत। (विंडोज में डेटाग्राम पाइप हैं, जेबर्टन के उत्तर के अनुसार यूनिक्स नहीं है)
बेन वॉइग्ट

1
@BenVoigt अच्छी तरह से, डेटाग्राम सॉकेट पैकेट वितरण अविश्वसनीय है, इसलिए एक लिखना जरूरी नहीं है कि एक कॉल पढ़े। शायद स्थानीय सॉकेट के लिए, लेकिन यह आपकी टिप्पणी से स्पष्ट नहीं है। इसलिए इसकी समस्या है।
xaxxon

3
@xaxxon: दोनों पाइप और यूनिक्स डोमेन सॉकेट हैं , स्थानीय इसलिए दोषरहित रिसीवर सब पर अपनी कतारों खाली किया जाता है।
बेन वोइगेट

6
हां, UDP के विपरीत , डेटाग्राम Unix डोमेन सॉकेट्स की गारंटी , इन-ऑर्डर डिलीवरी है।
jtchitty
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.