2017-05-08 12 views
10

पर स्ट्रीमवाइटर खोलने का प्रयास करते समय मोनो लटकता है मैं जो प्रोग्राम लिख रहा हूं वह इंटर-प्रोसेस संचार के लिए लिनक्स में फीफो पाइप का उपयोग कर रहा है। यह सबसे अच्छा हैकी है, लेकिन इस पर ध्यान दिए बिना मुझे समस्याएं हैं।एक नामित पाइप

 if (!File.Exists(Path.GetTempPath() + "gminput.pipe")) 
     { 
      ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/usr/bin/mkfifo", Arguments = Path.GetTempPath() + "gminput.pipe", }; 
      Process proc = new Process() { StartInfo = startInfo, }; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 
     if (!File.Exists(Path.GetTempPath() + "gmoutput.pipe")) 
     { 
      ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/usr/bin/mkfifo", Arguments = Path.GetTempPath() + "gmoutput.pipe", }; 
      Process proc = new Process() { StartInfo = startInfo, }; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 

     using (StreamWriter outputPipe = new StreamWriter(Path.GetTempPath() + "gmoutput.pipe")) 
     using (StreamReader inputPipe = new StreamReader(Path.GetTempPath() + "gminput.pipe")) 
     { 
      Console.WriteLine("This code is never reached!"); 
     } 

सभी मैं कर रहा हूँ अगर पाइप पहले से मौजूद है जाँच कर रहा है, और यदि नहीं, उसे बनाने के लिए mkfifo कहते हैं। यह हिस्सा ठीक काम करता प्रतीत होता है, नामित पाइप सही ढंग से बनाए जाते हैं। जब भी मैं उन्हें खोलने की कोशिश करता हूं (या तो StreamWriter, StreamReader, या दोनों के साथ), प्रोग्राम बस लटकता है। कोई त्रुटि या कुछ भी नहीं। यह भी डीबगर में लटका है।

सबसे अच्छा हिस्सा है ... यह काम करता था। मेरे पास इंटर-प्रोसेस संचार काम कर रहा था और फिर यह सिर्फ अस्पष्ट रूप से रुक गया। मैंने जो कुछ भी देखा है उसे छोड़कर मैंने सबकुछ बाहर टिप्पणी की, मेरे सिस्टम को पुनरारंभ किया, पाइप को फिर से बनाया, आदि का कोई फायदा नहीं हुआ। क्या देता है? क्या मेरे कोड में कुछ गड़बड़ है या सिस्टम में हस्तक्षेप करने पर कुछ और है?

+6

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

उत्तर

3

यह डिज़ाइन द्वारा है। निम्न का प्रयास करें: 2 बैश टर्मिनलों को खोलें, एक पाइप बनाएं, फिर इसे टर्मिनल में से एक में पढ़ें और इसे दूसरे में लिखें। उदाहरण के लिए

>mkfifo test.fifo 
>echo "test" > test.fifo 

>cat test.fifo 

आप देखेंगे कि कोई फर्क नहीं पड़ता कि प्रत्येक पक्ष दूसरी तरफ इंतजार कर रहा है।

प्रक्रिया 1 की इनपुट पाइप प्रक्रिया 2 की आउटपुट पाइप और वीज़ा बनाम है। यदि दोनों प्रक्रियाएं पाइप तक पहुंचने के लिए एक ही कोड का उपयोग करती हैं, तो प्रक्रिया 1 अपनी इनपुट पाइप और कुछ लिखने के लिए प्रक्रिया 2 की प्रतीक्षा करने वाले ब्लॉक को पढ़ती है। प्रक्रिया 2 भी इसकी इनपुट पाइप पढ़ती है और लिखने के लिए प्रक्रिया 1 की प्रतीक्षा करती है, लेकिन प्रक्रिया 1 प्रतीक्षा कर रही है और उसने अन्य पाइप भी नहीं खोला है। ग्रिडलॉक।

पाठक या लेखक को एक अलग थ्रेड में चलाने के लिए इसका एक तरीका है। इस तरह की प्रक्रिया 1 & 2 दोनों पाइप खोलें और ग्रिडॉक हल हो गया है।

दूसरा विकल्प, पाइप को असीमित रूप से खोलना है। मेरे सी # जंग लगी है, लेकिन वहाँ stackoverflow पर उदाहरण के बहुत सारे हैं:

How to do a non-waiting write on a named pipe (c#)?

NamedPipeServerStream in Mono

असल में रीडर/राइटर करने के लिए एक NamedPipeServerStream गुजरती हैं।

मुझे संदेह है कि इससे पहले काम किया गया था क्योंकि पी 1 ने रीडर खोला था, फिर लेखक, जबकि पी 2 ने राइटर खोला था, फिर रीडर इस प्रकार पी 1 को अनब्लॉक कर रहा था।

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