2012-05-22 5 views
5

के साथ argv सरणी ऑन-द-फ्लाई बनाना मैं एक खोल बना रहा हूं और सिस्टम कॉल 'execvp' के साथ कुछ परेशानी हो रही है। मैंने इस विषय पर कुछ अन्य प्रश्न देखे लेकिन वे अस्पष्ट थे, और पूरी तरह से संबोधित नहीं हुए (जो भी प्रश्न पूछते थे, उन्होंने अधिक जानकारी नहीं दी और उन्हें अच्छे जवाब नहीं मिले)।एक सी खोल बनाना। execvp रिटर्न 'ऐसी कोई फ़ाइल' त्रुटि नहीं है। malloc

जाहिर है मैं अपने खुद के कमांड लाइन है और मैं जैसे

mysh some/path $ ps -a 

stdin से उपयोगकर्ता इनपुट पढ़ रहा हूँ और मैं एक चार के रूप में एक आर्ग सरणी का निर्माण कर रहा हूँ ** और सरणी ही के बाद से काम करता है (मुझे लगता है कि) जब मैं अपने समारोह के भीतर मूल्यों प्रिंट आउट यह

args[0] = 'ps' 
args[1] = '-a' 
args[2] = '(null)' 

तो पता चलता है, मैं अपने प्रक्रिया है, जहां cmnd "ps" है और आर्ग के रूप में ऊपर perror आदि है, और भीतर कांटा और execvp (cmnd, args) फोन

मुझे

'Error: no such file or directory.' 

क्या मुझे $ PATH चर डालने की आवश्यकता है? क्या मैं कुछ और कर रहा हूँ?

यहाँ आर्ग सरणी पैदा करने के लिए मेरे कोड है: तो फिर

char ** get_args(char * cmnd) { 
int index = 0; 
char **args = (char **)emalloc(sizeof(char *)); 
char * copy = (char *) emalloc(sizeof(char)*(strlen(cmnd))); 
strncpy(copy,cmnd,strlen(cmnd)); 
char * tok = strtok(copy," "); 
while(tok != NULL) { 
    args[index] = (char *) emalloc(sizeof(char)*(strlen(tok)+1)); 
    strncpy(args[index],tok,strlen(tok)+1); 
    index++; 
    tok = strtok(NULL," "); 
    args = (char**) erealloc(args,sizeof(char*)*(index+1)); 
} 
args[index] = NULL; 
return args; 
} 

(emalloc और erealloc सिर्फ malloc और त्रुटि के साथ realloc में बनाया जाँच कर रहे हैं)

मैं यह कर:

void exec_cmnd(char*cmnd, char**args) { 
pid_t pid; 
if((pid=fork())==0) { 
    execvp(cmnd, args); 
    perror("Error"); 
    free(args); 
    free(cmnd); 
    exit(1); 
} 
else { 
    int ReturnCode; 
    while(pid!=wait(&ReturnCode)) { 
     ; 
    } 
} 
} 

और जैसा मैंने ऊपर कहा था, जब मेरी प्रक्रिया के अंदर execvp कहा जाता है तो यह विफल रहता है जब मैं किसी भी तर्क की आपूर्ति करता हूं लेकिन उनके बिना काम करता है (यानी जब argv == {'ps', NULL})

यदि आपको अधिक जानकारी चाहिए तो पूछने में संकोच नहीं करें। मुझे इसे हल करने की ज़रूरत है।

उत्तर

6

यह लगता है कि आप execvp

आप cmnd से पहले टोकन (कमांड नाम) को अलग करने के execvp

के पहले के रूप में तर्क आप

के रूप में यह कॉल कर सकते हैं पारित करने के लिए पहला तर्क में पूरी कमांड लाइन से पारित कर दिया गुजर में

execvp(args[0], args);

+0

यह बिल्कुल सही है। यदि आप 'ps -a' निष्पादित करना चाहते हैं, तो आपको' execvp ("ps", {"ps", "-a", NULL} को कॉल करने की आवश्यकता है) '। – caf

+0

एएके। माथे के लिए हथेली। हाँ, वह था, धन्यवाद। :) – matchdav

+0

फ्रिककिन ओकहम का रेज़र – matchdav

1

नोट आप का एक परिणाम के रूप में एक गैर समाप्त स्ट्रिंग है कि:

char * copy = (char *) emalloc(sizeof(char)*(strlen(cmnd))); 
strncpy(copy, cmnd, strlen(cmnd)); 

strncpy() जब आप इसका उपयोग करते हैं तो आपके लिए शून्य समाप्त नहीं होता है। आपको शून्य के लिए एक और बाइट आवंटित करने की भी आवश्यकता है। strdup() का उपयोग करने पर विचार करें यदि यह आपके लिए उपलब्ध है। यदि नहीं, तो इसे लिखने पर विचार करें। यह misallocation emalloc() और erealloc() के त्रुटि जांच संस्करणों के साथ भी एक समस्या है।

+1

या थीम को ध्यान में रखते हुए, 'estrdup() 'का उपयोग करें (या कार्यान्वित करें और उपयोग करें)। –

+0

मैं पूरी तरह से ऐसा करने वाला हूं। – matchdav

+0

मैं अभी यह कर रहा हूं, मेरे खोल के भीतर से चल रहा हूं। – matchdav

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

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