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

标签 c linux shell operating-system xv6

我正在尝试在类 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/

相关文章:

linux - 为文件夹树中的每个文件创建符号链接(symbolic link)

Linux 基准测试工具

c - 如何读取由 system() 函数创建的子进程的错误号?

linux - 用于在多个服务器上执行命令的 bash 脚本

c - 用 C 处理 microhttp 服务器中的 POST 数据

c - 有效地获取C中整数 vector 的绝对值

c - Windows : preventing assert() failures from opening the debug popup

用VC++编译C程序[2005]

linux - 如何使用上次修改日期而不是当前日期向文件添加时间戳

python - 匹配 2 个文件中的字符串,如果匹配则返回文件 2 中上面的行