2017-02-26 149 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