0

ユーザーからの特定のコマンドをサブストリングに分割しました。コードは次のとおりです。

     int i;

     char *line = malloc(BUFFER);
     char *origLine = line;
     fgets(line, 128, stdin);   // get a line from stdin


     // get complete diagnostics on the given string

     lineData info = runDiagnostics(line);

     char command[20];
     sscanf(line, "%20s ", command);
     line = strchr(line, ' ');

     printf("The Command is: %s\n", command);

     int currentCount = 0;                  // number of elements in the line
     int *argumentsCount = &currentCount;   // pointer to that


     // get the elements separated

     char** arguments = separateLineGetElements(line,argumentsCount);


     // here we call a method that would execute the commands


    if (execvp(*arguments,*argumentsCount)  < 0)       // execute the command
    {
                printf("ERROR: exec failed\n");
                exit(1);
    }

でコマンドを実行するexecvp(*arguments,*argumentsCount)と失敗します。

どうしたの ?

ありがとう 。

編集 :

ユーザーからの入力は:ですls > a.out 。したがって、3つの文字列があります。

ls、、、>そしてa.out 失敗します。

4

3 に答える 3

2

シェルを呼び出さない場合、シェルリダイレクトは機能しません。 また、lsプログラムを見つけるためのパス検索もありません。 いくつかのオプション

  • 代わりにsystem()を使用し、戻ったら終了します

  • シェルを実行して、コマンドを実行させます

  • シェルのようにリダイレクトを設定してから、必要な各子プログラムをフォークして実行します。

また、コマンドはあまり意味がありません。おそらく、>の代わりに¦が必要であり、パスにない場合はa.outのディレクトリを指定する必要があります。意味のある名前も付けることを検討してください。

于 2012-05-19T17:41:27.433 に答える
1

ls > a.outコマンドラインで実行し、アプリケーションに渡される引数>ではない場合。a.outそれらはシェルによって解釈され、stdoutをリダイレクトします。

つまり、やりたいことをすることはできません。1


1.ええ、そうですが、この方法ではありません。アプリケーションは、引数を解釈し、ファイルを作成し、ストリームリダイレクトを設定する必要があります。

于 2012-05-19T17:34:53.387 に答える
1

execvpコマンドのmanページから:

   int execvp(const char *file, char *const argv[]);

2番目の引数は、によって実行されるコマンドへの引数としてのnullで終了するC文字列のリストですexecvp。しかし、あなたのコードでは、int間違っている2番目の引数としてを渡します。

変数に引数のリストがある場合は、次のargumentsようにexecvpを呼び出します。

execvp(arguments[0],arguments);
于 2012-05-19T17:34:54.417 に答える