0

ac プログラムで引数付きのコマンドを実行しようとしています。たとえば、ユーザーが「./a.out ls -la」でプログラムを実行すると

プログラムは、la オプションを指定して ls を実行する必要があります。

しかし、私はそれを行う方法がわかりません。

私のプログラムはフォークを使用します。

私はこの方法を試します:

pid = fork();

if(pid == 0){

execvp(argv[1], &argv[2]);

}else{

wait(NULL);

}

しかし、うまくいきません。

コマンドで引数を渡す配列をexecvpの2番目の引数として渡したいのですが、ポインターと少し混乱しています(ポインターのポインターとはさらに混乱しています:s)。

引数にダッシュがあるため、これが機能しないことはわかっていますが、ダッシュを使用しない場合でも、プログラムは「la」オプションを処理せずに「ls」のみを起動します。

誰かが私を助けることができれば、私は良い方法を知ってうれしいです.

ありがとうございました。

4

2 に答える 2

0

ここにいくつかの問題があります。

  1. 失敗した場合は扱いませんfork()

  2. 失敗した場合は扱いませんexecvp()。印刷strerror(errno)すると、exec が失敗する理由の手がかりが得られる場合があります。

  3. execvp()は、最後の要素としてchar* const持つ必要のある配列を取ります。NULLまた、最初の要素はプログラムの名前にする必要があります。これは慣例ですが、あなたの例では引数が1つずれていることを意味します。つまり、引数なしlsのコマンドで呼び出されたと考え-laます。argv[]終了後にポインタがあることが保証されているかどうかNULLわからないので、直接使用しないでください。例えば

    char* args[3];
    args[0] = argv[1]; // You have already checked argc is at least three right?
    args[1] = argv[2];
    args[2] = NULL;
    // do your fork and error check then in the child
    
    int result = execvp(argv[1], args);
    // if you get here exec failed, handle as appropriate
    
  4. 終了値を確認する必要があり、問題を診断できるようにwait()正当なポインターを渡す必要があります。int

于 2011-04-11T10:06:30.513 に答える