1

これは私のコードのスニペットです:

pid_t children[MAX_PIPES];
for (i = 0; i < numPipes; i++)
{
    pid_t child_pid = fork();
    children[i] = child_pid;

    switch(child_pid)
    {
        case 0:
            // Some code thats executed in the child that executes execv()
            break;
        case -1: // Unable to create child
            perror("fork");
            break;
    }
}
// Wait for children 
for (j = 0; j < numPipes && children[j] != 0; j++)
{
    if (background)
        waitpid(children[j], &status, WNOHANG);
    else
        waitpid(children[j], &status, 0);
}

現在、execv() を 1 回だけ呼び出すと正常に動作しますが、既にフォークされた子プロセス内で execv() を使用して複数のコマンドを次々と実行しようとしています。

その機能を追加するにはどうすればよいですか? 子内のループ内に別の fork() を追加しようとしましたが、成功しませんでした。

どんなアイデアでも大歓迎です。ありがとう

4

2 に答える 2

1

execv、他のexec()コマンドと同様に、失敗した場合を除いて戻りません。新しいプログラムのコンテキストは、現在のプログラムの代わりにロードされます。

于 2013-04-10T20:55:50.053 に答える
0

問題は、execv子プロセス全体を呼び出されるコマンドに置き換えることです。そのため、複数の execv コマンドを子プロセスに入れることはできません。

複数のコマンドが必要な場合はfork()execv()それぞれを実行する必要があります。を使用できますが、 (シェルを起動する) とsystem()同じ方法でパラメーターを処理しません。execv()

複数のコマンドを実行する場合は、次のようなラッパーを使用して 2 番目のコマンドを実行する必要がありfork()ますexecv()

int
subv(char *path, char * const argv[])
{
  int ret;
  pid_t a_pid = fork();
  if (a_pid == -1) return -1;
  if (a_pid != 0) { wait(&ret); return ret; }
  return execv(path, argv);
}

すべての execv 呼び出しを subv() に置き換え、リターン コードを適切に処理します。

于 2013-04-10T20:52:08.423 に答える