2012-05-04 35 views
23

execvp इस प्रकार परिभाषित किया गया है:निष्पादित करने के लिए argv पैरामीटर क्यों नहीं है?

int execvp(const char *file, char *const argv[]); 

कौन सा उपयोग किए जाने से इस जैसे कोड precludes:

const char* argv[] = {"/bin/my", "command", "here", NULL}; 
execvp(argv[0], argv); 

इस था एक आकस्मिक चूक? क्या यह इस के आसपास const_cast सुरक्षित है? या कुछ निष्पादन कार्यान्वयन वास्तव में उस स्मृति पर लिखते हैं?

+3

हालांकि कार्यों का 'exec *' परिवार अपने तर्कों को संशोधित नहीं करता है जैसा कि POSIX विनिर्देश में उल्लेख किया गया है, ध्यान दें कि विंडोज़ पर, ['CreateProcess' को एक लिखने योग्य कमांड लाइन की आवश्यकता होती है] (http://blogs.msdn.com /b/oldnewthing/archive/2009/06/01/9673254.aspx)। –

उत्तर

7

POSIX कल्पना का कहना है (http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html): संकेत के

argv[] और envp[] सरणियों और तार जो उन सरणियों बिंदु कॉल द्वारा कार्यकारी कार्यों में से एक के लिए, एक के रूप में छोड़कर संशोधित नहीं किया जाएगा, प्रक्रिया छवि को बदलने का परिणाम।

मुझे लगता है कि लापता (या गलत स्थान) const बस एक ऐतिहासिक विषमता है।

+5

लापता 'const' ऐतिहासिक विषमता नहीं है; बल्कि, ऐसा इसलिए है क्योंकि आप बिना किसी कलाकार के 'char **' से 'const const char * const *' में परिवर्तित नहीं कर सकते हैं (लेकिन आप * C *+ में * कर सकते हैं)। –

+2

@Adam: ठीक है। यह पोस्ट में पहले प्रश्न का उत्तर है। मैंने उस पर ध्यान दिया: http://c-faq.com/ansi/constmismatch.html –

+1

निष्पादन के लिए POSIX spec के अंत में RATIONALE अनुभाग भी देखें। यह कॉन्स चूक की पसंद बताता है। –

-1

मैं इसी स्थिति में आया था। चूंकि execvp() में दूसरे पैरामीटर के रूप में char *const है, जिसका अर्थ यह है कि यह एक char को स्थिर पॉइंटर स्वीकार करता है। इसलिए, यदि आप इसे एक पॉइंटर चार पास करते हैं तो यह पॉइंटर चार को एक चरम पर एक स्थिर सूचक में डालने में सक्षम होगा। तो, बजाय इसे घोषित करने के

const char* argv[] = {"/bin/my", "command", "here", NULL}; 

char* argv[] = {"/bin/my", "command", "here", NULL}; 

कोशिश करते हैं और वह इस मुद्दे के बिना argv[] को स्वीकार करेंगे।

+0

'कॉन्स्टेंट टू पॉइंटर चार' अर्थहीन है। – EJP

+0

मेरा मतलब है कि एक char के लिए सूचक स्थिर है। मैं आगे बढ़ गया और व्याकरण गलती को सही किया। –

+0

जो कि 'execvp() 'लाइन से असाइनमेंट स्टेटमेंट में त्रुटि/चेतावनी को ले जाता है (जब तक कि आपके पास बहुत ही कमजोर कंपाइलर न हो)। –