2017-02-26 1 views
1

私は、1行に複数のコマンドを含むコマンドラインインタープリターを書きたいと思っています。コマンドラインインタプリタ(1行に複数のコマンドがある)

私は1行あたり1つのcomamndで動作するプログラムを書いたが、もっと多くのコマンドを入力した場合、comamndsは次のように入力される。 pwd; catファイル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

1つのコマンドが正しく解析されますが、複数のコマンドが正しく解析されない場合、パーサーに問題があります。あなたはパーサーを表示しません... – StoryTeller

答えて

0

あなたはそれを説明する方法について申し訳ありませんが、あなたがコマンドを1つずつ実行したいということのようですが、それらはlsの出力をパイプ、ほかに(相互に通信していませんpwdには意味がありません)。

解決策は簡単です。入力をセミコロンで分割し、各コマンドを1つのコマンドと同じように処理します(これはそのためです)。それはあなたが、例えばでこれを実装することができ、この

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

のようなものを見ることができるいくつかの擬似コードで

strtokまたは類似の機能。

+0

私はそれをしました..私は入力を分割し、配列に入れ、配列が正しいことを確認します。 私はコマンドを実行しようとすると "コマンドが見つかりません" – Xri

関連する問題