सी . में निष्पादन सिस्टम कॉल

Exec System Call C



सी में कार्यकारी परिवार के कई कार्य हैं। इन सी कार्यों का मूल रूप से एक अलग प्रक्रिया में सिस्टम कमांड चलाने के लिए उपयोग किया जाता है जो मुख्य प्रोग्राम और आउटपुट प्रिंट करता है।

इस लेख में, मैं कार्यों के निष्पादन परिवार के बारे में बात करने जा रहा हूं और आपको दिखाता हूं कि सी में इन निष्पादन परिवार कार्यों में से प्रत्येक का उपयोग कैसे करें। तो, चलिए शुरू करते हैं।







Exec परिवार में सी सिस्टम कार्य:

निष्पादन फ़ंक्शन परिवारों को शीर्षलेख में परिभाषित किया गया है unistd.h . तो, आपको इस हेडर का उपयोग सी प्रोग्राम पर करना चाहिए जहां आप इन कार्यों का उपयोग करना चाहते हैं।



उनके कार्य मापदंडों के साथ उपलब्ध निष्पादन कार्य नीचे दिए गए हैं:



  • int execl (कॉन्स्ट चार * पथ, कॉन्स्ट चार * आर्ग, …, न्यूल);
  • int execlp (कॉन्स्ट चार * फ़ाइल, कॉन्स्ट चार * आर्ग, …, न्यूल);
  • int execv (कॉन्स्ट चार * पथ, चार * कॉन्स्ट argv []);
  • int execvp (कॉन्स्ट चार * फ़ाइल, चार * कॉन्स्ट argv []);
  • int execle(const char *path, const char *arg,…, NULL, char * const envp[]);
  • int execve(const char *file, char *const argv[], char *const envp[]);

आइए देखें कि इनमें से प्रत्येक कार्य क्या करता है और उनका उपयोग कैसे किया जाता है।





execl () सिस्टम फ़ंक्शन:

Execl() सिस्टम फ़ंक्शन में निष्पादन योग्य बाइनरी फ़ाइल का पथ लेता है (अर्थात। / बिन / एलएस ) पहले और दूसरे तर्क के रूप में। फिर, तर्क (यानी। -एलएचओ , /घर ) जिसके बाद आप निष्पादन योग्य को पास करना चाहते हैं शून्य . फिर execl() सिस्टम फ़ंक्शन कमांड चलाता है और आउटपुट प्रिंट करता है। यदि कोई त्रुटि होती है, तो execl() रिटर्न -1। अन्यथा, यह कुछ भी नहीं लौटाता है।

वाक्य - विन्यास:

NSबहिष्कृत(स्थिरांक char *पथ, स्थिरांक char *गुस्सा,...,शून्य);

Execl() सिस्टम फ़ंक्शन का एक उदाहरण नीचे दिया गया है:



#शामिल

NSमुख्य(शून्य) {
char *बाइनरीपाथ= '/ बिन / एलएस';
char *arg1= '-एलएच';
char *arg2= '/घर';

बहिष्कृत(बाइनरीपाथ,बाइनरीपाथ,arg1,arg2,शून्य);

वापसी 0;
}

मैं भाग गया एलएस -एलएच / होम execl () सिस्टम फ़ंक्शन का उपयोग करके कमांड। जैसा कि आप देख सकते हैं, सही परिणाम प्रदर्शित होता है।

execlp () सिस्टम फ़ंक्शन:

execl () का उपयोग नहीं करता है पथ वातावरण विविधता। तो, निष्पादन योग्य फ़ाइल का पूरा पथ इसे execl() के साथ चलाने के लिए आवश्यक है। execlp() पाथ पर्यावरण चर का उपयोग करता है। इसलिए, यदि कोई निष्पादन योग्य फ़ाइल या कमांड PATH में उपलब्ध है, तो उसे चलाने के लिए कमांड या फ़ाइल नाम पर्याप्त है, पूर्ण पथ की आवश्यकता नहीं है।

वाक्य - विन्यास:

NSनिष्पादन(स्थिरांक char *फ़ाइल, स्थिरांक char *गुस्सा,...,शून्य);

हम execlp () सिस्टम फ़ंक्शन का उपयोग करके execl () उदाहरण को निम्नानुसार फिर से लिख सकते हैं:

#शामिल

NSमुख्य(शून्य) {
char *कार्यक्रम का नाम= 'एलएस';
char *arg1= '-एलएच';
char *arg2= '/घर';

निष्पादन(कार्यक्रम का नाम,कार्यक्रम का नाम,arg1,arg2,शून्य);

वापसी 0;
}

मैंने केवल कमांड नाम पारित किया है रास , पूर्ण पथ नहीं / बिन / एलएस . जैसा कि आप देख सकते हैं, मुझे पहले जैसा ही आउटपुट मिला।

execv () सिस्टम फ़ंक्शन:

Execl () फ़ंक्शन में, निष्पादन योग्य फ़ाइल के पैरामीटर फ़ंक्शन को विभिन्न तर्कों के रूप में पास किए जाते हैं। Execv () के साथ, आप सभी मापदंडों को NULL टर्मिनेटेड एरे में पास कर सकते हैं अर्जीवी . सरणी का पहला तत्व निष्पादन योग्य फ़ाइल का पथ होना चाहिए। अन्यथा, execv () फ़ंक्शन execl () फ़ंक्शन की तरह ही काम करता है।

वाक्य - विन्यास:

NSकार्यकारी(स्थिरांक char *पथ, char *स्थिरांकअर्जीवी[]);

हम execl () उदाहरण को इस प्रकार फिर से लिख सकते हैं:

#शामिल

NSमुख्य(शून्य) {
char *बाइनरीपाथ= '/ बिन / एलएस';
char *args[] = {बाइनरीपाथ, '-एलएच', '/घर',शून्य};

कार्यकारी(बाइनरीपाथ,args);

वापसी 0;
}

जैसा कि आप देख सकते हैं, मुझे सही आउटपुट मिल रहा है।

execvp () सिस्टम फ़ंक्शन:

execv() सिस्टम फंक्शन की तरह ही काम करता है। लेकिन, PATH पर्यावरण चर का उपयोग किया जाता है। इसलिए, निष्पादन योग्य फ़ाइल का पूरा पथ आवश्यक नहीं है जैसा कि execlp() में है।

वाक्य - विन्यास:

NSकार्यकारी(स्थिरांक char *फ़ाइल, char *स्थिरांकअर्जीवी[]);

हम निष्पादन () उदाहरण को निम्नानुसार फिर से लिख सकते हैं:

#शामिल

NSमुख्य(शून्य) {
char *कार्यक्रम का नाम= 'एलएस';
char *args[] = {कार्यक्रम का नाम, '-एलएच', '/घर',शून्य};

कार्यकारी(कार्यक्रम का नाम,args);

वापसी 0;
}

जैसा कि आप देख सकते हैं, सही आउटपुट प्रदर्शित होता है।

execle () सिस्टम फ़ंक्शन:

execl() की तरह ही काम करता है लेकिन आप इसके साथ अपने स्वयं के पर्यावरण चर प्रदान कर सकते हैं। पर्यावरण चर को एक सरणी के रूप में पारित किया जाता है एनवीपी . का अंतिम तत्व एनवीपी सरणी शून्य होनी चाहिए। अन्य सभी तत्वों में कुंजी-मान जोड़े स्ट्रिंग के रूप में होते हैं।

वाक्य - विन्यास:

NSexecle(स्थिरांक char *पथ, स्थिरांक char *गुस्सा,...,शून्य, char * स्थिरांकएनवीपी[] );

Execle() सिस्टम फ़ंक्शन का एक उदाहरण नीचे दिया गया है:

#शामिल

NSमुख्य(शून्य) {
char *बाइनरीपाथ= '/ बिन/बैश';
char *arg1= '-सी';
char *arg2= 'फेंक दिया '$HOSTNAME . पर जाएं:आपके ब्राउज़र से $PORT।'';
char *स्थिरांकenv[] = {'HOSTNAME=www.linuxhint.com', 'पोर्ट = 8080',शून्य};

execle(बाइनरीपाथ,बाइनरीपाथ,arg1,arg2,शून्य,env);

वापसी 0;
}

मैंने दो पर्यावरण चर पारित किए होस्ट नाम तथा बंदरगाह एक्सेल () फ़ंक्शन के लिए। जैसा कि आप देख सकते हैं, मैं उन्हें निष्पादन योग्य से एक्सेस कर सकता हूं /बिन/बाश .

निष्पादित () सिस्टम फ़ंक्शन:

Execve() की तरह ही आप execve() के साथ अपना खुद का पर्यावरण चर प्रदान कर सकते हैं। आप तर्कों को सरणियों के रूप में भी पारित कर सकते हैं जैसा आपने execv() में किया था।

वाक्य - विन्यास:

NSक्रियान्वित करना(स्थिरांक char *फ़ाइल, char *स्थिरांकअर्जीवी[], char *स्थिरांकएनवीपी[]);

execle() उदाहरण को निम्नानुसार फिर से लिखा जा सकता है:

#शामिल

NSमुख्य(शून्य) {
char *बाइनरीपाथ= '/ बिन/बैश';
char *स्थिरांकargs[] = {बाइनरीपाथ, '-सी', 'फेंक दिया '$HOSTNAME . पर जाएं:$पोर्ट
आपके ब्राउज़र से।'',शून्य};
char *स्थिरांकenv[] = {'HOSTNAME=www.linuxhint.com', 'पोर्ट = 8080',शून्य};

क्रियान्वित करना(बाइनरीपाथ,args,env);

वापसी 0;
}

जैसा कि आप देख सकते हैं, हमें वही आउटपुट मिलता है जैसे कि execle() उदाहरण में।

तो, यह है कि आप लिनक्स में सिस्टम प्रोग्रामिंग के लिए सी में निष्पादन फ़ंक्शन परिवार का उपयोग कैसे करते हैं। इस लेख को पढ़ने के लिए धन्यवाद।