我正在尝试在类 unix xv6 OS 的 shell 程序中实现基本命令执行。我正在编辑的部分 shell 代码是 runcmd 函数,我在其中使用 execvp 命令执行终端中使用的命令。该程序在我编译时编译没有错误,但是当我尝试在命令行上键入命令时没有任何反应。我已经阅读了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);
}