2012-03-15 7 views
7

यदि मैं ऐसी परिस्थिति में हूं जहां मुझे अनुक्रम में बाहरी आदेश निष्पादित करने की आवश्यकता है, तो सबसे अच्छा समाधान क्या है?हास्केल: सख्त अनुक्रम में बाहरी आदेशों का निष्पादन करें

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

पुस्तिका पूरा होने की जांच के लिए, प्रणाली "और" runCommand "कार्यों" मैं पूरी तरह बीच का अंतर समझ में नहीं आता है और उनके बाहर निकलने के कोड की जांच?

"यह काफी" प्रणाली "या rawSystem उपयोग करने के लिए है। कर सकते हैं कोई मुझे यह स्पष्ट करता है। मैं केवल देख सकता हूं कि वे अलग-अलग मान वापस लौटते हैं: बाहर निकलने वाले कोड बनाम प्रक्रिया संभाल। कोई अन्य अंतर?

क्या मुझे उपर्युक्त अनुक्रम के लिए काम करने के लिए "रनकॉमैंड" का उपयोग करने की आवश्यकता होगी? क्या मुझे कॉल करने की ज़रूरत है प्रक्रिया संभाल पर प्रतीक्षा करें?

धन्यवाद।

उत्तर

11

मुझे समझ में आता है कि आप बाह्य आदेश चलाने के लिए System.Process मॉड्यूल का उपयोग कर रहे हैं। यह अच्छा है।

मॉड्यूल में ब्लॉकिंग और गैर-अवरुद्ध आईओ क्रिया दोनों शामिल हैं। गैर-अवरुद्ध वाले (जैसे createProcess, runCommand) एक प्रक्रिया बनाएं और इसे अभी भी चलते समय तुरंत अपने हैंडल को वापस कर दें। अवरुद्ध वाले (जैसे readProcess, system) किसी भी हैंडल को वापस न करें, बल्कि प्रक्रिया समाप्त होने के परिणाम को वापस करने के परिणाम को वापस करें।

यह सुनिश्चित करने के लिए कि प्रक्रिया समाप्त हो गई है, आपको या तो ब्लॉकिंग क्रियाओं का उपयोग करने की आवश्यकता है, या waitForProcess का उपयोग करें, जो तब तक अवरुद्ध हो जाता है जब तक दिए गए हैंडल की प्रक्रिया मर जाती है।

यह पर्याप्त "प्रणाली" या rawSystem उपयोग करने के लिए है "और उनके बाहर निकलने के कोड की जांच?

हां।

के बीच अंतर" प्रणाली "और" runCommand "कार्यों

मुख्य अंतर system अवरुद्ध है जबकि runCommand नहीं है

क्या मुझे उपरोक्त अनुक्रम के लिए काम करने के लिए "runCommand" का उपयोग करने की आवश्यकता होगी?

नहीं, ब्लॉक को कॉल करना आपके मामले में पर्याप्त होना चाहिए।

क्या मुझे प्रक्रिया संभाल पर प्रतीक्षा करने की आवश्यकता है?

केवल तभी यदि आप गैर-अवरुद्ध कॉल का उपयोग करने का निर्णय लेते हैं। उपयोग के

उदाहरण:

import System.Process 
main = do 
    ExitSuccess <- system "make snapshot" 
    ExitSuccess <- system "backup snapshot" 
    return() 
+0

मेरे लिए यह स्पष्ट करने के लिए धन्यवाद।समझ में आता है। –

+0

आपके उदाहरण में, आप दूसरे प्रोग्राम को चलाने से पहले सफलतापूर्वक समाप्त होने वाले पहले प्रोग्राम को कैसे चेक करते हैं? –

+4

@ r.sendecky: 'ExitSuccess <- system" स्नैपशॉट बनाता है "' system' कॉल के परिणाम पर एक पैटर्न मिलान करता है - यह सुनिश्चित कर लें कि यह 'ExitSuccess' लौटाता है। यदि पैटर्न मिलान विफल रहता है, तो [आईओ की 'असफल' कहा जाता है] (http://en.wikibooks.org/wiki/Haskell/do_Notation#Translating_the_bind_operator)। – rampion

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