मैं कॉलेज के लिए एक परियोजना पर काम कर रहा हूं जहां मैं केवल सर्वर और टर्मिनल (दोनों द्वारा निर्मित दोनों) के बीच संचार स्थापित करने के लिए नामित पाइप (mkfifo()) का उपयोग कर सकता हूं।सी/लिनक्स - सर्वर <-> नामित पाइप के साथ टर्मिनल संचार
हैं:
- केवल 1 सर्वर
- 1 या अधिक टर्मिनल;
वास्तव में अपने आवेदन इस तरह काम करता है:
- टर्मिनल सर्वर के लिए (लाल में ) एक नामित पाइप के माध्यम से एक command_t संरचना भेजें। यह नामित पाइप एक फीफो है और इसे सभी टर्मिनलों के बीच साझा किया जाता है। कमांड_टी strucutre भेजने के बाद टर्मिनल नीले में किसी अन्य नामित पाइप () से उत्तर पढ़ने का प्रयास करेगा और जब तक सर्वर उस पाइप में कुछ लिखता है तब तक इसे अवरुद्ध कर दिया जाएगा।
- सर्वर नामित पाइप (लाल में) से पढ़ता है और पहले आने वाले पहले आदेश के आधार पर प्राप्त आदेश (command_t संरचना) को संसाधित करता है। कई धागे हैं जिसका अर्थ है कि एक ही समय में कई अनुरोध संसाधित किए जाते हैं।
- आदेश प्रसंस्करण के बाद सर्वर (नीला में ) एक और नामित पाइप के माध्यम से एक reply_t संरचना भेजता है।
समस्या:
अगर मैं केवल एक ही धागे से सर्वर प्रारंभ यह सब ठीक काम करता है क्योंकि प्रतिक्रियाओं (reply_t) आदेशों के आने के क्रम में भेजा जाता है (command_t)
लेकिन अगर मैं एक से अधिक धागे के साथ सर्वर शुरू करता हूं तो मैं गारंटी नहीं दे सकता कि प्रतिक्रियाएं आदेशों के आगमन के उसी क्रम में भेजी जाती हैं और इससे मुझे मिश्रित प्रतिक्रियाएं मिलेंगी (जैसे कुछ, मैं टर्मिनल पर प्राप्त करूंगा टर्मिनल से कमांड से निष्पादन का परिणाम 1 2 और आदि ...)।
मैं कुछ इस तरह बनाने के बारे में सोच रहा था:
इस समाधान में मैं सर्वर के बजाय एक उत्पादन पाइप सभी टर्मिनलों के बीच साझा करने के लिए जुड़ा प्रत्येक टर्मिनल के लिए एक आउटपुट पाइप के लिए होगा। लेकिन मैं सी में टर्मिनलों की एक चर संख्या को कैसे कार्यान्वित कर सकता हूं? मैं यह भी पता नहीं लगा सकता कि एक नया टर्मिनल इनपुट पीआईपीई कब खुलता है।
कोई सुझाव? धन्यवाद!
यहां तक कि अगर सर्वर में केवल एक धागा है, तो आप कैसे सुनिश्चित करते हैं कि सही टर्मिनल को प्रतिक्रिया मिलती है क्योंकि एकाधिक टर्मिनल फीफो पढ़ रहे हैं? – kaylum
@kaylum यह काम करता है क्योंकि अगर टर्मिनल ए कमांड भेजता है तो सर्वर को कुछ लिखने तक इसे पढ़ने() फ़ंक्शन पर अवरुद्ध कर दिया जाएगा। यदि ए और बी कमांड भेजने वाले पहले को कमांड भेजता है तो उसे पढ़ने() फ़ंक्शन पर अवरुद्ध करने वाला पहला व्यक्ति होगा। तो जब सर्वर प्रतिक्रिया लिखता है, तो टर्मिनल ए पढ़ने वाला पहला होगा और फिर टर्मिनल बी –
ऐसा नहीं है कि चीजें कैसे काम करती हैं। सिर्फ इसलिए कि एक प्रक्रिया कॉल पहले पढ़ती है यह सुनिश्चित नहीं करती है कि इसे पहले जागृत किया जाएगा। और वैसे भी, आप यह सुनिश्चित नहीं कर सकते कि लिखने के बाद और पढ़ने से पहले एक प्रक्रिया निलंबित नहीं की जाती है। मल्टीप्रोसेस/थ्रेडिंग कठिन है। निस्संदेह खोज के रूप में कई दौड़ की स्थिति संभव है। – kaylum