के साथ 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})
यदि आपको अधिक जानकारी चाहिए तो पूछने में संकोच नहीं करें। मुझे इसे हल करने की ज़रूरत है।
यह बिल्कुल सही है। यदि आप 'ps -a' निष्पादित करना चाहते हैं, तो आपको' execvp ("ps", {"ps", "-a", NULL} को कॉल करने की आवश्यकता है) '। – caf
एएके। माथे के लिए हथेली। हाँ, वह था, धन्यवाद। :) – matchdav
फ्रिककिन ओकहम का रेज़र – matchdav