在C中实现命令解释器

时间:2013-12-14 20:36:29

标签: c linux interpreter

我必须在C中编写一个命令解释器。它必须:

  • 处理命令选项和参数
  • 支持没有选项和参数的命令
  • 允许将一个命令重定向到另一个命令(例如:ls -a | wc),最多3个重定向

我们还可以假设一个固定的最大参数(比如MAXARG)。

此刻我编写了这段代码,但我不知道为什么有些命令不起作用(例如cd)。请帮帮我。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

void  parse(char *line, char **argv)
{
 while (*line != '\0') {       
      while (*line == ' ' || *line == '\t' || *line == '\n' || *line=='|')
           *line++ = '\0';     
      *argv++ = line;         
      while (*line != '\0' && *line != ' ' && 
             *line != '\t' && *line != '\n') 
           line++;            
 }
 *argv = '\0';               
 }


 int main(int argc,char *argv[])
  {
  int child_pid;
  char * arg[10];       
   int child_status;
  char str[10];
  do
  {
  printf(">> ");
  gets(str);
  parse(str,arg);
  if(!strcmp(arg[0],"end"))
  {
    break;
   }
  child_pid = fork();
  if(child_pid == 0)
  {
    execvp(*arg,arg);
    printf("Unknown command\n");


   }
   else 
  {
    wait(&child_status);
    printf("koniec\n");
  }
 }
  while(1==1);
    return 0;
 }

2 个答案:

答案 0 :(得分:2)

你需要一个解析器/词法分析器来检查你的输入,这些工具已经可用,有几个名字:YACCBisonFlex

关于你的<command> | <command>情况是pipe并且是Linux内核空间提供的功能,如果你想要,你需要使用linux内核api为管道进行编码。

答案 1 :(得分:2)

对于cd,您不应该执行fork/exec因为那样,您只会更改子项的工作目录,这与更改父项的工作目录不同。对于像cd这样的命令,您必须在解析它之后使用chdir(2)而不执行fork