2010-08-17 19 views

उत्तर

18

मेरे सिर के ऊपर बंद और आप POSIX संदेश कतार (नहीं SysV वाले) के बारे में बात यह सोचते हैं:

  • पाइप्स आकार में सीमित नहीं हैं, संदेश कतार में हैं।
  • पाइप्स को फाइल डिस्क्रिप्टर का उपयोग करके सिस्टम में एकीकृत किया जा सकता है, संदेश कतारों का अपना स्वयं का फ़ंक्शन है, हालांकि लिनक्स select(), poll(), epoll() और mqd_t पर मित्र का समर्थन करता है।
  • पाइप्स, एक बार बंद होने के बाद, दोनों पक्षों को पुनः स्थापित करने के लिए कुछ पक्षों की सहायता की आवश्यकता होती है, संदेश पंक्तियों को बंद कर दिया जा सकता है और दूसरी तरफ के सहभागिता के बिना दोनों तरफ फिर से खोल दिया जा सकता है।
  • पाइप फ्लैट की तरह फ्लैट हैं, एक संदेश संरचना को लागू करने के लिए आपको दोनों तरफ प्रोटोकॉल लागू करना होगा, संदेश कतार पहले से ही संदेश उन्मुख हैं, कहने के लिए कोई सावधानी बरतनी नहीं है, कहें, पांचवां संदेश कतार।
+0

ठीक है, बहुत बहुत धन्यवाद ... लेकिन मुझे एक छोटा सा संदेह है कि "एक बार बंद होने वाले पाइपों को दोनों तरफ से किसी तरह का समर्थन की आवश्यकता होती है", तो आप इस बिंदु को हाइलाइट करना चाहते हैं कि पाइप कर्नेल लगातार नहीं हैं और संदेश क्यूस हैं .. और पाइप को फिर से बंद करने के लिए वास्तव में किस तरह के suport की आवश्यकता है? – mint9

+0

@ mint9: अच्छी तरह से बोलते हुए आपको सिगिप पकड़ने की ज़रूरत है, इसे गहन तरीके से संभालें, फिर पाइप को फिर से खोलें। मुझे कल्पना है कि आप अपनी प्रक्रिया (दोनों तरफ) कर सकते हैं, अपने stdin/stdout को डुप्लिकेट करें, माता-पिता को चलते रहें (वे गार्ड के रूप में कार्य करते हैं), फिर बंद होने पर आप अपने बच्चों को मरने दें (दोनों तरफ) और कांटा/डुप्ली/पाइप प्रक्रिया। – hroptatyr

+0

ठीक है, मुझे मिल गया। धन्यवाद – mint9

9

वे वास्तव में बहुत अलग चीजें हैं।

सबसे बड़ा व्यावहारिक अंतर यह है कि एक पाइप में "संदेश" की धारणा नहीं है, यह केवल write() बाइट्स और read() बाइट्स के लिए एक पाइप है। प्राप्त करने वाले अंत में यह जानने का एक तरीका होना चाहिए कि आपके प्रोग्राम में डेटा का एक टुकड़ा "संदेश" का गठन करता है, और आपको इसे स्वयं लागू करना होगा। इसके अलावा बाइट्स का क्रम परिभाषित किया गया है: बाइट्स आपके द्वारा दिए गए क्रम में बाहर आ जाएंगे। और, आम तौर पर बोलते हुए, इसमें एक इनपुट और एक आउटपुट होता है।

एक संदेश कतार का उपयोग "संदेशों" को स्थानांतरित करने के लिए किया जाता है, जिसमें एक प्रकार और आकार होता है। तो प्राप्त करने वाला अंत केवल एक निश्चित संदेश के साथ एक "संदेश" की प्रतीक्षा कर सकता है, और यदि यह पूर्ण है या नहीं, तो आपको चिंता करने की ज़रूरत नहीं है। कई प्रक्रियाएं एक ही कतार से भेज और प्राप्त कर सकती हैं।

अधिक जानकारी के लिए man mq_overview और/या man svipc देखें।

+1

कतार में भी आप किसी भी संरचना को संदेश के रूप में भेज सकते हैं ताकि इस मामले में प्राप्त करने वाले अंत को भी पता होना चाहिए कि "आपके प्रोग्राम में डेटा का किस प्रकार का संदेश है। –

संबंधित मुद्दे