2010-02-18 13 views
11

मुझे लूप में विभिन्न तर्कों के साथ एक यूनिक्स कमांड निष्पादित करने की आवश्यकता है। अब मुझे आश्चर्य है कि क्या मुझे cmdp() का उपयोग करना चाहिए, cmd और args में गुज़रना, या सिस्टम का उपयोग करना, cmd + args वाली स्ट्रिंग बनाना?सिस्टम() का उपयोग कब करें और execv *() का उपयोग कब करें?

उत्तर

10

अच्छा, अन्य उत्तरों अधिकतर सही हैं।

सिस्टम, जबकि न केवल fork एस और फिर exec एस, यह exec आपकी प्रक्रिया नहीं है, यह आपके प्रोग्राम को तर्क के रूप में पास करते हुए डिफ़ॉल्ट खोल चलाता है।

तो, जब तक आप वास्तव में एक खोल (पैरामीटर पार्स करने और तरह के लिए) चाहते हैं कि उसे है ज्यादा अधिक की तरह कुछ करने के लिए कुशल:

int i = fork(); 
if (i != 0) { 
    exec*(...); // whichever flavor fits the bill 
} else { 
    wait(); // or something more sophisticated 
} 
7

exec फ़ंक्शन का परिवार वर्तमान प्रक्रिया को एक नए से बदल देगा, जबकि system नई प्रक्रिया को बंद कर देगा, और फिर इसे समाप्त करने के लिए प्रतीक्षा करें। जो भी आप उपयोग करना चाहते हैं उस पर निर्भर करता है।

चूंकि आप इसे एक लूप में कर रहे हैं, मुझे लगता है कि आप मूल प्रक्रिया को प्रतिस्थापित नहीं करना चाहते हैं। इसलिए, मेरा सुझाव है कि आप system के साथ जाने का प्रयास करें।

+1

प्रणाली भी लाइन पार्स को आदेश है, जो हो सकता है लाइन विषयों इंजेक्शन हमलों के लिए छेद खोलें। – falstro

+0

मैंने वेब पर इस पर कुछ ट्यूटोरियल की तलाश की और अधिकांश उदाहरण फोर्क() एक नई प्रक्रिया को संपादित किया और execvp() के साथ कांटा को प्रतिस्थापित किया। उसके बाद, माता-पिता की प्रक्रिया समाप्त होने के लिए मूल प्रक्रिया की प्रतीक्षा की गई। क्या यह मूल रूप से कौन सी प्रणाली() करता है? – helpermethod

+1

हां, यह मूल रूप से 'सिस्टम() 'करता है। कॉलिंग 'सिस्टम()' भी डिफ़ॉल्ट खोल चलाता है और आपके प्रोग्राम को तर्क के रूप में पास करता है, जो थोड़ा अधिक ओवरहेड बनाएगा। – jschmier

5

मैं केवल execvp का उपयोग करता हूं अगर मैं सिस्टम के साथ जो हासिल करना चाहता हूं उसे प्राप्त नहीं कर सकता। ध्यान दें कि सिस्टम के बराबर प्राप्त करने के लिए, आपको execvp, कांटा और कुछ सिग्नल हैंडलिंग की भी आवश्यकता है।

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