2012-01-11 10 views
6

जब मैं execvp पर कॉल करता हूं, उदाहरण के लिए execvp(echo, b) जहां बी कमांड के लिए तर्कों की एक सरणी है, तो इस सरणी को बाद में परिवर्तित किए गए execvp कॉल को प्रभावित करेगा? जब मैं execp (echo, b) को कॉल करने का प्रयास करता हूं, तो यह बी के अंदर की सामग्री के बजाय प्रिंटिंग (शून्य) समाप्त होता है। क्या कोई यह बता सकता है कि तर्कों को सही तरीके से पारित करने के लिए मुझे और क्यों करना है?execvp के तर्क सरणी हैंडलिंग?

उत्तर

12

exec() या उसके रिश्तेदारों को कॉल करने के बाद, आपका मूल प्रोग्राम मौजूद नहीं है। इसका मतलब है कि उस कार्यक्रम में कुछ भी exec() कॉल के बाद कुछ भी प्रभावित नहीं कर सकता है, क्योंकि यह कभी नहीं चलता है। हो सकता है कि आप अपने तर्क सरणी को सही तरीके से नहीं बना रहे हैं?

#include <unistd.h> 

int main(void) 
{ 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    execvp("echo", execArgs); 

    return 0; 
} 

execvp() man page से:: यहाँ execvp() की एक त्वरित काम कर उदाहरण है

execv(), execvp(), और execvpe() कार्यों संकेत की एक सरणी शून्य-समाप्त तार करने के लिए प्रदान करते हैं कि नए कार्यक्रम के लिए उपलब्ध तर्क सूची का प्रतिनिधित्व करें। सम्मेलन द्वारा पहला तर्क, फ़ाइल को निष्पादित फ़ाइल से जुड़े फ़ाइल नाम को इंगित करना चाहिए। पॉइंटर्स की सरणी को NULL पॉइंटर द्वारा समाप्त कर दिया जाना चाहिए।

एक आम गलती है कि "पहले तर्क, सम्मेलन द्वारा, फ़ाइल को निष्पादित फ़ाइल से जुड़े फ़ाइल नाम को इंगित करना चाहिए।" यह वह हिस्सा है जो सुनिश्चित करता है कि echo को "echo" argv[0] के रूप में मिलता है, जो संभवतः यह निर्भर करता है।

+0

गूंज का उपयोग करने के बजाय, मैंने एक और प्रोग्राम का उपयोग किया जो अनिवार्य रूप से अपने Argv सरणी में सबकुछ प्रिंट करता है। मुझे हमेशा लगता है कि argv [0] कमांड का नाम होगा (execv का पहला param), लेकिन इस मामले में execv को कॉल करने के बाद, argv [0] नहीं था। बल्कि यह execv का दूसरा param था। क्या आप इसे स्पष्ट कर सकते हैं? – Lucas

+0

ठीक है, जब आपने तर्क सूची को 'execv' में पास कर दिया, तो क्या आपने आदेश के नाम पर' argv [0] 'सेट किया था? दूसरा प्रोग्राम 'execvp' * के रूप में आपके द्वारा पारित सरणी * नए प्रोग्राम में * argv' बन जाती है, इसलिए आपको इसे जिस तरह से उम्मीद की जा सकती है उसे सेट अप करने की आवश्यकता है। –

+0

यह कोड कॉन्स शुद्धता को तोड़ता है। मैं बल्कि कॉन्स चार * तर्क लिखता हूं [] = {...}; लेकिन execvp के प्रोटोटाइप के लिए तर्क में तारों की आवश्यकता होती है! – user877329

0

याद रखें, exec के बाद कॉल करें कि आपका प्रोग्राम एक नए द्वारा आदान-प्रदान किया गया है। यह अब निष्पादित नहीं है, इसलिए exec कॉल के बाद एक ही प्रक्रिया में कोई भी कोड वास्तव में पहुंच योग्य नहीं है।

क्या आप सुनिश्चित हैं कि बी सरणी न्यूल के साथ समाप्त हो गई है? निष्पादन के लिए सही तत्व सही ढंग से काम करने के लिए अंतिम तत्व होना चाहिए। साथ ही, अपना पहला पैरामीटर "echo" पर भी सेट करना याद रखें (यह argv [0]) है।

प्रयास करें

execlp("echo", "echo", "something", NULL); 

Btw, execlp में थोड़ा और अधिक उपयोग करने के लिए सुविधाजनक है, आप के रूप में आप चाहते हैं के रूप में कई मापदंडों पारित कर सकते हैं।

+1

यह नहीं है कि 'execvp()' कैसे काम करता है। –

+0

जो मैं समझता हूं, execvp कमांड और argv सरणी में लेता है। Execvp कॉल के समय, कमांड और argv सरणी दोनों शून्य नहीं थे। हालांकि, जब गूंज कहा जाता था तो इसमें कोई तर्क नहीं था। – Lucas

+0

क्षमा करें, टाइपो - मतलब 'execlp' ... –

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