gpt4 book ai didi

c - Shell 似乎可以识别命令但不执行它们

转载 作者:太空狗 更新时间:2023-10-29 11:36:29 27 4
gpt4 key购买 nike

我正在尝试在类 unix xv6 操作系统的 shell 程序中实现基本命令执行。我正在编辑的 shell 代码部分是 runcmd 函数,我在其中使用 execvp 命令执行终端中使用的命令。当我编译程序时,程序编译没有错误,但是当我尝试在命令行上键入命令时,没有任何反应。我读过 man pages对于 exec 命令,但我仍然不太了解这些参数需要在 exec() 命令中传递的正确方式,或者何时使用哪个版本的 exec() 因为我对操作系统编程仍然很陌生。

我在这里没有实现什么需要添加才能执行命令?我有以下 runcmd 函数的代码:

编辑:

我只是为每个命令添加了更多带有二进制文件路径的 exec 语句;但是,只有第一个 exec 命令有效(在本例中为 cd)。当我使用任何其他命令时,命令行都像执行 CD 一样执行它。我如何让它适用于多个命令?

struct cmd {
int type; // ' ' (exec), | (pipe), '<' or '>' for redirection
};
struct
execcmd {
int type; // ' '
char *argv[MAXARGS]; // arguments to the command to be exec-ed
};

// Execute cmd. Never returns.
void
runcmd(struct cmd *cmd)
{
int p[2], r;
struct execcmd *ecmd;
struct pipecmd *pcmd;
struct redircmd *rcmd;

if(cmd == 0)
exit(0);

switch(cmd->type){
default:
fprintf(stderr, "unknown runcmd\n");
exit(-1);

case ' ':
ecmd = (struct execcmd*)cmd;

if(ecmd->argv[0] == 0)
exit(0);
//fprintf(stderr, "exec not implemented\n");
execvp("/bin/cd" , ecmd->argv );
execvp("/bin/grep" , ecmd->argv );
execvp("/bin/echo" , ecmd->argv );
execvp("/bin/cat" , ecmd->argv );
execvp("/bin/ls" , ecmd->argv );
break;

case '>':
case '<':
rcmd = (struct redircmd*)cmd;
//fprintf(stderr, "redir not implemented\n");
execvp("/bin" , ecmd->argv );
runcmd(rcmd->cmd);
break;

case '|':
pcmd = (struct pipecmd*)cmd;
fprintf(stderr, "pipe not implemented\n");
int execl(const char *path, const char *arg, ...);
break;
}
exit(0);
}

最佳答案

看起来您正在尝试执行“/bin”目录。

您应该使 exec 调用的第一个参数成为用户想要运行的二进制文件。

使用 perror 函数也会在命令失败时为您提供有用的输出。

关于c - Shell 似乎可以识别命令但不执行它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554872/

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