2017-02-26 121 views
1

我想写一个每行有多个命令的comamnd行解释器。每行有多个命令的命令行解释器

我在C中编写了一个程序,它每行有1个comamnd,但是如果我输入更多的命令不工作,comamnds会像下面这样输入:ls -l; pwd;猫文件; LS。

首先我解析指定参数时,我把它们放到数组和我有这个功能:

pid_t pid; 
pid = fork();  

switch(pid) { 
    case -1: 
     printf("DEBUG:Fork Failure\n"); 
     exit(-1); 
    case 0: 
     execvp(cmd[j], cmd); 

     if(execvp(cmd[j], cmd) == -1) { 
      printf("Command Not Found\n"); 
      exit(0); 
     } 

    default: 
    wait(NULL); 
    printf("DEBUG:Child Finished\n"); 
} 

我的解析器:

printf("shell> "); 

fgets (input, MAX_SIZE, stdin); 

if ((strlen(input)>0) && (input[strlen (input) - 1] == '\n')) { 
    input[strlen (input) - 1] = '\0'; 
} 


printf("INPUT: %s\n", input); 

cnd = strtok(input, " ;"); 

int i = 0; 

while(cnd != NULL) {  
    cmd[i] = cnd; 
    i++; 
    cnd = strtok(NULL, ";"); 

我认为我必须使用管道来解决我的问题,但如何? 任何想法?

对不起坏英语

+0

如果一个命令正确解析,但多个命令解析不正确,解析器出现问题。你不显示你的解析器... – StoryTeller

回答

0

你解释它的方式,它似乎是要执行后,其他的命令之一,但不是让他们互相通信(此外,管道ls输出到pwd只是没有意义)。

为此,解决方案很简单:将输入拆分成分号,并处理每个命令,因为它是单个命令(因为它就是这样)。

对于一些伪代码可能看起来像这样

input = read_next_line(); 
while ((next_command = get_next_command(input)) != NULL) 
{ 
    execute_command(next_command); 
} 

您可以用例如实现这个strtok或类似的功能。

+0

我做到了..我分割输入并将其放入数组,并检查数组是否正确。 当我尝试执行命令,我看到“命令未找到” – Xri