2010-10-01 11 views
5

के साथ सिस्टम() को प्रतिस्थापित करें, मैं अपने सी प्रोग्राम में सिस्टम() का उपयोग नहीं करना चाहता, क्योंकि सिस्टम (3) ब्लॉक और यह वही नहीं है जो मैं चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या है?गैर-अवरुद्ध फ़ंक्शन

उत्तर

12

मुझे लगता है कि एक त्वरित और गंदे कार्रवाई sytem को कॉल करना है (कमांड &)। & नई प्रक्रिया को जन्म देगा।

+0

बिल्कुल +1। 'सिस्टम() 'प्लेटफार्म-निर्भर है वैसे भी। 'फोर्क()' या उस तरह की चीजों के साथ अपने स्रोत की गड़बड़ी करने के बजाय, उस सिस्टम का उपयोग करें जो 'system()' आपको पहुंच प्रदान करता है। – DevSolar

+0

फोर्क की तुलना में बहुत अच्छा समाधान अगर आप मुझे –

8

नई प्रक्रिया बनाने के लिए fork() का उपयोग करें और फिर system() (या exec फ़ंक्शन) का उपयोग करें। मूल प्रक्रिया तब निष्पादन जारी रखने में सक्षम हो जाएगी।

6

आप popen का उपयोग करना चाह सकते हैं। यह नई प्रक्रियाएं बनाता है और आपको प्रक्रिया आउटपुट को अपनी प्रक्रिया में रीडायरेक्ट करने की अनुमति देता है।

3

यदि विंडोज़ में, विंडोज एपीआई से ShellExecute() फ़ंक्शन का उपयोग करें।

यदि यूनिक्स में, fork() के लिए system() के रूप में उल्लेख किया गया है।

7

उत्तर आपके वास्तविक लक्ष्य पर निर्भर करता है। आप यह नहीं कहते कि आप किस प्लेटफॉर्म पर हैं, और मुझे विंडोज़ के बारे में बहुत कम पता है, इसलिए यह केवल लिनक्स/यूनिक्स पर आपके विकल्पों को कवर करता है।

  1. आप बस एक और कार्यक्रम तैयार करना चाहते हैं, और इसके साथ बातचीत करने की आवश्यकता नहीं है। इस मामले में, fork() पर कॉल करें, और उसके बाद बाल प्रक्रिया में execve() (या संबंधित फ़ंक्शन) चलाएं।

  2. आप किसी अन्य प्रोग्राम से बातचीत करना चाहते हैं। इस मामले में, popen() का उपयोग करें।

  3. आप अपने प्रोग्राम का हिस्सा उपप्रोसेसर के रूप में चलाने के लिए चाहते हैं। इस मामले में, fork() का उपयोग करें, और बच्चे में चलाने के लिए आवश्यक कार्यों को कॉल करें।

  4. आपको उपप्रोसेसर के रूप में चल रहे अपने प्रोग्राम के हिस्से से बातचीत करने की आवश्यकता है। pipe() पर कॉल करें ताकि आपके पास संवाद करने के लिए फ़ाइल डिस्क्रिप्टर हो, फिर fork() पर कॉल करें और फ़ाइल डिस्क्रिप्टर जोड़ी को संवाद करने के लिए उपयोग करें। वैकल्पिक रूप से, आप एक सॉकेट, संदेश कतार, साझा स्मृति, आदि के माध्यम से संवाद कर सकते हैं

+0

हाथों में विकल्पों का अच्छा रैंड डाउन, और उनके बीच कैसे चयन करें। –

+0

'कांटा()' फिर 'सिस्टम()' खोलने के लिए चारों ओर लटकने वाली एक बेकार प्रक्रिया छोड़ देगा। 'System() 'के बजाय' execve()' या बाल प्रक्रिया में समान कॉल करना बेहतर है। यदि आप शैल की विशेषताओं का उपयोग करना चाहते हैं, तो '/ bin/sh' निष्पादित करें। – jilles

+0

@jilles - अच्छा बिंदु, धन्यवाद। ठीक करने के लिए संपादित किया गया। – bstpierre