2016-12-02 4 views
8

मैं कॉलेज के लिए एक परियोजना पर काम कर रहा हूं जहां मैं केवल सर्वर और टर्मिनल (दोनों द्वारा निर्मित दोनों) के बीच संचार स्थापित करने के लिए नामित पाइप (mkfifo()) का उपयोग कर सकता हूं।सी/लिनक्स - सर्वर <-> नामित पाइप के साथ टर्मिनल संचार

हैं:

  • केवल 1 सर्वर
  • 1 या अधिक टर्मिनल;

वास्तव में अपने आवेदन इस तरह काम करता है:

enter image description here

  • टर्मिनल सर्वर के लिए (लाल में ) एक नामित पाइप के माध्यम से एक command_t संरचना भेजें। यह नामित पाइप एक फीफो है और इसे सभी टर्मिनलों के बीच साझा किया जाता है। कमांड_टी strucutre भेजने के बाद टर्मिनल नीले में किसी अन्य नामित पाइप () से उत्तर पढ़ने का प्रयास करेगा और जब तक सर्वर उस पाइप में कुछ लिखता है तब तक इसे अवरुद्ध कर दिया जाएगा।
  • सर्वर नामित पाइप (लाल में) से पढ़ता है और पहले आने वाले पहले आदेश के आधार पर प्राप्त आदेश (command_t संरचना) को संसाधित करता है। कई धागे हैं जिसका अर्थ है कि एक ही समय में कई अनुरोध संसाधित किए जाते हैं।
  • आदेश प्रसंस्करण के बाद सर्वर (नीला में ) एक और नामित पाइप के माध्यम से एक reply_t संरचना भेजता है।

समस्या:

अगर मैं केवल एक ही धागे से सर्वर प्रारंभ यह सब ठीक काम करता है क्योंकि प्रतिक्रियाओं (reply_t) आदेशों के आने के क्रम में भेजा जाता है (command_t)

लेकिन अगर मैं एक से अधिक धागे के साथ सर्वर शुरू करता हूं तो मैं गारंटी नहीं दे सकता कि प्रतिक्रियाएं आदेशों के आगमन के उसी क्रम में भेजी जाती हैं और इससे मुझे मिश्रित प्रतिक्रियाएं मिलेंगी (जैसे कुछ, मैं टर्मिनल पर प्राप्त करूंगा टर्मिनल से कमांड से निष्पादन का परिणाम 1 2 और आदि ...)।

मैं कुछ इस तरह बनाने के बारे में सोच रहा था: enter image description here

इस समाधान में मैं सर्वर के बजाय एक उत्पादन पाइप सभी टर्मिनलों के बीच साझा करने के लिए जुड़ा प्रत्येक टर्मिनल के लिए एक आउटपुट पाइप के लिए होगा। लेकिन मैं सी में टर्मिनलों की एक चर संख्या को कैसे कार्यान्वित कर सकता हूं? मैं यह भी पता नहीं लगा सकता कि एक नया टर्मिनल इनपुट पीआईपीई कब खुलता है।

कोई सुझाव? धन्यवाद!

+2

यहां तक ​​कि अगर सर्वर में केवल एक धागा है, तो आप कैसे सुनिश्चित करते हैं कि सही टर्मिनल को प्रतिक्रिया मिलती है क्योंकि एकाधिक टर्मिनल फीफो पढ़ रहे हैं? – kaylum

+0

@kaylum यह काम करता है क्योंकि अगर टर्मिनल ए कमांड भेजता है तो सर्वर को कुछ लिखने तक इसे पढ़ने() फ़ंक्शन पर अवरुद्ध कर दिया जाएगा। यदि ए और बी कमांड भेजने वाले पहले को कमांड भेजता है तो उसे पढ़ने() फ़ंक्शन पर अवरुद्ध करने वाला पहला व्यक्ति होगा। तो जब सर्वर प्रतिक्रिया लिखता है, तो टर्मिनल ए पढ़ने वाला पहला होगा और फिर टर्मिनल बी –

+1

ऐसा नहीं है कि चीजें कैसे काम करती हैं। सिर्फ इसलिए कि एक प्रक्रिया कॉल पहले पढ़ती है यह सुनिश्चित नहीं करती है कि इसे पहले जागृत किया जाएगा। और वैसे भी, आप यह सुनिश्चित नहीं कर सकते कि लिखने के बाद और पढ़ने से पहले एक प्रक्रिया निलंबित नहीं की जाती है। मल्टीप्रोसेस/थ्रेडिंग कठिन है। निस्संदेह खोज के रूप में कई दौड़ की स्थिति संभव है। – kaylum

उत्तर

1

डैनियल,

मैं एक ऐसी ही सर्वर से पहले लागू किया है, तो आप एक टर्मिनल सुन सकते हैं, और जब टर्मिनल संदेश खत्म आप प्रक्रिया बांट और प्रतिक्रिया पैरेंट प्रक्रिया में, बच्चे की प्रक्रिया पर वापस भेज जबकि कर सकते हैं एक पाश में आप अगले टर्मिनल के लिए एक और श्रोता बनाने के रूप में ccarton ने कहा:

कुछ इस तरह:

while (1) 
{ 
    newsockfd = accept(sockfd, 
       (struct sockaddr *) &cli_addr, &clilen); 
    if (newsockfd < 0) 
    error("ERROR on accept"); 
    pid = fork(); 
    if (pid < 0) 
    error("ERROR on fork"); 
    if (pid == 0) 
    { 
    close(sockfd); 
    dostuff(newsockfd); 
    exit(0); 
    } 
    else 
    close(newsockfd); 
} /* end of while */ 

आप यहाँ एक पूर्ण विवरण प्राप्त कर सकते हैं: http://www.linuxhowtos.org/C_C++/socket.htm

"सर्वर कोड में वृद्धि" अनुभाग के तहत।

उम्मीद है कि इससे मदद मिलती है।

0

टर्मिनल के साथ सर्वर को सिंक्रनाइज़ करने का एक तरीका System V semaphore का उपयोग कर रहा है। "X" मिनट के लिए चैनल को "सुनना" शुरू करने से पहले सैमफोर टर्मिनल द्वारा लिया जाता है। यदि कोई संदेश आती है, टर्मिनल प्रक्रिया इसे प्रतिक्रिया वापस भेजती है, अन्यथा, यदि टाइमआउट होता है तो यह केवल सेफफोर को छोड़ देता है ताकि अन्य टर्मिनल सुनना शुरू कर सके। इसके साथ समस्या यह है कि आप समानांतर में कई संदेश संसाधित करने की क्षमता को खो देते हैं। के रूप में @Moulin अपने संरचनाओं command_t और reply_t में में (उदाहरण के लिए पीआईडी ​​fork() द्वारा दिया) एक आईडी का उपयोग करने के लिए कहा

एक और दृष्टिकोण है।

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