0

入力が配列へのポインターであると仮定し、各要素に "ls -l" を位置 0 に格納し、次に cat helloworld.txt を位置 1 に格納するというように、ls、cat、 pwd、それを実行します。基本的に、私がやっていることは、これらすべてのコマンドを含むファイルを持っていることです。最初に、char *input[10] として宣言されている入力変数にそれらを格納します。これで、その配列に必要なものが揃い、ls、cat などの個々のメイン コマンドを抽出できるようになり、それらすべてを実行したいと考えています。

例えば、

位置 0 に ls -l があり、最初の変数に ls があり、それを execvp に渡したい場合、位置 1 に cat sample.txt がある可能性があるため、最初の変数は cat になり、それを execvp に渡します。 cat sample.txt(input[i])をexecvpへ。何らかの奇妙な理由で、これは機能していません。これらすべてのコマンドを execvp のループで実行して、完了するとすべてのコマンドが正常に実行されるようにするにはどうすればよいですか。これが私の試みです。最初のループの最後で、execvp を実行し、それが終了することを期待してから、さらに入力を抽出します。

手伝ってください。

       for(i=0; i<lineCount; i++)
        {

            first = malloc(sizeof(char)*50); 

            for(j=0; j<strlen(input[i]); j++)
            {
                if(input[i][j]!=' ')
                {
                    first[j]=input[i][j];
                }
                else
                {    
                    break;
                }
            } 

            execvp(first, input[i]);

         }

私は execp(first, input) をやってみましたが、それもうまくいきませんでした。

4

3 に答える 3

2

最初の段落で、opengroup execマニュアルの内容は次のとおりです。

呼び出しプロセス イメージが新しいプロセス イメージによってオーバーレイされるため、成功した exec からの戻りはありません。

opengroup fork manualを読んで、 fork と exec を組み合わせて使用​​することをお勧めします。

于 2013-03-07T01:56:28.453 に答える
2

execvp() を一度使用すると、 execvp を呼び出したプロセスの pid を除いて、関連するプロセスの実行のコンテキストが変更されるため、一度 execvp() が存在しないため、ループは機能しません。より多くの反復。

execvp() は主に子プロセスによって呼び出されることを意図しており、「n」回の execvp() 呼び出しの場合、「n」個の子プロセスがフォークされている必要があります。

良い習慣:

  • 子プロセスでの execl、execv、execle、execve、execlp、execvp 、システム コールのファミリの使用。

  • 新しいプロセス イメージが child に読み込まれ、実行された後、起動されたプロセスの終了コードを収集し、必要なエラー処理を実行します。

  • 子プロセスはゾンビ状態になり、親プロセスは wait()/waitpid() を実行し、すべての子プロセスが終了するまで待機してから終了する必要があります。

-- 編集 -- OP 参照用の POC コード

#include <stdio.h> 
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>




int  main(void)
{
pid_t cpid;
int   status = 0;

cpid = fork();
  if (cpid == 0)
  {
   char *cmd[] = { "ls", "-l", (char *)0 };
   int ret = execv ("/bin/ls", cmd);
  }
wait(&status);
  if(status < 0)
     perror("Abnormal exit of program ls");
  else
     printf("Exit Status of ls is %d",status);
}
于 2013-03-07T02:05:41.707 に答える
1

exec 実行中のプロセスをあなたのものに置き換えるため、プロセスが置き換えられるため、exec戻りません。success

一連のプロセスを実行したい場合、簡単な方法は、popenまたはsystemそれらを実行するなどのユーティリティ関数を使用することです。完全に制御するには、実行するコマンドごとに通常の UNIX fork/execコンボを 1 回使用します。

于 2013-03-07T01:58:17.920 に答える