gpt4 book ai didi

c - 构建 C shell。 execvp 返回 'No such file' 错误。使用 malloc 即时创建 argv 数组

转载 作者:太空狗 更新时间:2023-10-29 14:59:34 24 4
gpt4 key购买 nike

我正在构建一个 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 和 errealloc 只是内置错误检查的 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 - 构建 C shell。 execvp 返回 'No such file' 错误。使用 malloc 即时创建 argv 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com