构建一个C shell. execvp返回’No such file’错误.使用malloc即时创建argv数组

我正在构建一个shell,并且在系统调用’execvp’时遇到了一些问题.我在这个主题上看到了一些其他的问题,但它们含糊不清,似乎没有完全解决(谁问过这些问题并没有提供太多信息而且得不到好的答案).

显然我有自己的命令行,我正在读取stdin的用户输入

mysh some/path $ps -a 

我正在构建一个args数组作为char **并且数组本身可以工作(我认为),因为当我打印出我的函数中的值时,它显示

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

所以,我在我的进程中调用fork和execvp(cmnd,args),其中cmnd是“ps”,args如上所述,perror等.

我明白了

'Error: no such file or directory.'  

我需要输入$PATH变量吗?我还在做别的什么吗?

这是我生成args数组的代码:

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}时)

如果您需要更多信息,请不要犹豫.我需要解决这个问题.

最佳答案
它认为你在第一个参数中传递了整个命令行到execvp

你必须将第一个令牌(命令名)与cmnd分开,作为execvp的第一个参数传递

你可以称之为

execvp(args [0],args);

转载注明原文:构建一个C shell. execvp返回’No such file’错误.使用malloc即时创建argv数组 - 代码日志