【发布时间】:2015-12-09 20:50:55
【问题描述】:
我正在尝试在类 unix xv6 操作系统的 shell 程序中实现基本命令执行。我正在编辑的部分 shell 代码是 runcmd 函数,我在其中使用 execvp 命令执行终端中使用的命令。该程序在我编译时编译没有错误,但是当我尝试在命令行上键入命令时没有任何反应。我已经阅读了 exec 命令的man pages,但我仍然不明白这些参数需要在 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);
}
【问题讨论】:
-
好吧,对于初学者来说,
int execl(const char *path, const char *arg, ...);声明函数execl,它不会调用它。这个“xv6”操作系统有<unistd.h>吗? -
@zwol 是的,它有
并且我还没有替换该行,因为我认为我可以等到我必须实施管道。 -
重新修改问题,
exec系列函数仅在失败时返回;你需要一个fork在某个地方。此外,cd是一种特殊命令,必须作为 shell 内置实现,而不是作为外部可执行文件;我希望/bin/cd不存在。 -
Re
execl,你说得对,它没有造成任何伤害,我读错了代码部分。很抱歉造成混乱。
标签: c linux shell operating-system xv6