2013-02-01 38 views
9

मैं किसी अन्य प्रोग्राम (मैटलैब) के भीतर बाहरी प्रोग्राम (wgrib2) के आउटपुट को कैप्चर करने के लिए नामित पाइप का उपयोग कर रहा हूं। Matlab कोड नीचे है, और system पाइप बनाने के लिए कमांड लाइन का उपयोग करता है। यहां मेरे प्रश्न हैं:mkfifo के साथ खोला गया पाइप नामित होना चाहिए और कैसे?

  1. क्या मुझे इसका उपयोग करने के बाद नामित पाइप myfifo बंद करना होगा? कोड चलाने के बाद यह जारी रहता है।
  2. यदि myfifo को बंद करने की आवश्यकता है, तो इसे बंद करने का आदेश क्या है?
  3. मैं कई बार नीचे कोड नमूना चला रहा हूं (> 1000), तो क्या यह ठीक है अगर मैं नामित पाइप का पुन: उपयोग करता हूं और अंत तक इसे बंद नहीं करता?
system('mkfifo myfifo');  % Make a named pipe myfifo 
% Call the external program wgrib2 and dump its output to the named pipe myfifo 
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo &'); 
fid = fopen('myfifo', 'r'); % Open the named pipe 
a = fscanf(fid, '%c');  % Read the output as character 
fclose(fid);     % Close the "file" (myfifo still exists afterward) 

उत्तर

1

आपको शायद MATLAB में सिस्टम आउटपुट कैप्चर करने के लिए नामित पाइप का उपयोग नहीं करना चाहिए। प्रति MATLAB's system() documentation, आप system() कॉल में सीधे आउटपुट को कैप्चर कर सकते हैं:

[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166'); 
a = cmdout 

हालांकि, अगर आप एक नामित पाइप का उपयोग करने पर जोर देते हैं, तो हाँ, आप इसे बंद कर देना चाहिए। आपको हमेशा बंद संसाधनों को खोलना चाहिए। लेकिन नामित पाइप को बंद करना इसे हटाएं।

9
  1. सं यूनिक्स एक फ़ाइल की तरह सब कुछ व्यवहार करता है। नामित पाइप अलग नहीं हैं। यदि आप इसका उपयोग कर रहे हैं, तो आप शायद इसे बंद करना चाहते हैं ताकि आप नामित पाइप के साथ अपनी मशीन को अव्यवस्थित न करें, लेकिन आपको इसे बंद करने की आवश्यकता नहीं है।

नीचे टिप्पणी को प्रतिबिंबित करने के लिए संपादित, जो सही है। हटाना! = बंद करना।

  1. आप नामित पाइप उसी तरह आप किसी भी फ़ाइल को बंद करें बंद:
fclose(mFifo) 

स्वीकार किए जाते हैं जवाब में उल्लेख किया है, समापन फीफो नहीं हटेगा। आपको इसे अलग से करने की आवश्यकता हो सकती है।

  1. नामित पाइप का पुनः उपयोग करने में कुछ भी गलत नहीं है। हालांकि, यह आपके ऊपर निर्भर है कि जब आप प्रत्येक पुनरावृत्ति के लिए इसे पढ़ना/लिखना चाहते हैं। एक बार पाइप से सभी डेटा पढ़े जाने के बाद, आप इसे जितनी बार चाहें उतनी बार उपयोग करने के लिए स्वतंत्र हो जाते हैं।
+1

यह उत्तर गलत है। 1: पाइप बंद करने के लिए प्रोग्राम वास्तव में * आवश्यकता * करते हैं। यदि खराब प्रोग्राम अपनी फाइलें बंद नहीं करते हैं तो भी वर्कस्टेशन खुले फाइलों से बाहर हो सकते हैं। 2: आप ** इसे हटाकर नामित पाइप बंद नहीं करते हैं। बंद करना और हटाना अलग-अलग संचालन हैं। – willkil

+1

आप सही हैं। मैंने जन्म के लिए जवाब अपडेट किया है। –

0

सहमत नहीं हो सकता। आप इसे बंद करके फीफो बंद कर देते हैं। सिस्टम समाप्त होने पर फीफो बंद हो जाता है (सिस्टम() ऊपर कॉल)। जब फीफो बंद हो जाता है तो दूसरी तरफ पता है कि कोई और डेटा नहीं है (ईओएफ स्थिति, उदाहरण कोड में कोई स्पष्ट ईओएफ जांच नहीं है लेकिन यह वास्तविक में बहुत संभव है) और खत्म हो जाती है।

+0

क्या 'सहमत नहीं हो सकता' के साथ? – EJP

+0

क्या आप # 2 के लिए उपयोग करने के लिए आदेश दिखा सकते हैं? – KAE

+0

मैं वास्तव में इस साइट पर आया क्योंकि फीफो के बारे में ज्यादा जानकारी नहीं है। लेकिन ओप इसे बंद करने के बाद फीफो को हटाने की अपेक्षा करता है, जबकि सिस्टम obviosly अन्य तरीके से काम करता है। किसी अन्य फ़ाइल के साथ ही कोई भी फीफो खोल सकता है और बंद कर सकता है या इसे हटाने का फैसला कर सकता है। यहां उदाहरण दिया गया है: – Arseny