3

以下のコードでは、プロセスは 1 つの子 ( fork() ) を作成し、次に子はexec()を呼び出して自分自身を置き換えます。execのstdoutは、シェルではなくパイプに書き込まれます。次に、親プロセスはパイプから exec が書き込んだもの を読み取ります while (read(pipefd[0], buffer, sizeof(buffer)) != 0)

誰かが上記とまったく同じことを行う方法を教えてもらえますか? ただし、N 個の子プロセス (上記のように自分自身を exec に置き換えます) を使用します。

int pipefd[2];
pipe(pipefd);

if (fork() == 0)
{
    close(pipefd[0]);    // close reading end in the child

    dup2(pipefd[1], 1);  // send stdout to the pipe
    dup2(pipefd[1], 2);  // send stderr to the pipe

    close(pipefd[1]);    // this descriptor is no longer needed

    exec(...);
}
else
{
    // parent

    char buffer[1024];

    close(pipefd[1]);  // close the write end of the pipe in the parent

    while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
    {
    }
}
4

3 に答える 3

1

私は答えを見つけました。プロセスが別のプロセスの出力を上書きしないように、パイプの配列を作成しました。

これが私のコードです。間違いはありますか?

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

#define N 10

int main(int argc, char *argv[]) {
    ssize_t readlen;
    int pipefd[N][2];
    int i;
    for (i = 0; i < N; i++) {
        pipe(pipefd[i]);
    }

    int pid = getpid();

    for (i = 0; i < N; i++) {
        if (fork() == 0) //The parent process will keep looping
        {

            close(pipefd[i][0]);    // close reading end in the child

            dup2(pipefd[i][1], 1);  // send stdout to the pipe
            dup2(pipefd[i][1], 2);  // send stderr to the pipe

            close(pipefd[i][1]);    // this descriptor is no longer needed

            char b[50];
            sprintf( b, "%d", i);

            execl("/bin/echo", "echo", b,NULL);


        }
    }

    if (pid == getpid()) {

        // parent

        char buffer[1024];

        for (i = 0; i < N; i++) {
            close(pipefd[i][1]);  // close the write end of the pipe in the parent

            while ((readlen=read(pipefd[i][0], buffer, sizeof(buffer))) != 0)
            {
                        buffer[readlen] = '\0';
            }

            printf("%s\n",buffer);

        }
    }


}
于 2012-09-28T20:24:27.703 に答える
0

たぶん、このコードは仕事をするでしょう:

const int N = 10; //Number of child processes
int pipefd[2];
pipe(pipefd);
int i;
for (i = 0; i < N; i++) {
    if (fork() == 0) //The parent process will keep looping
    {
        close(pipefd[0]);    // close reading end in the child

        dup2(pipefd[1], 1);  // send stdout to the pipe
        dup2(pipefd[1], 2);  // send stderr to the pipe

        close(pipefd[1]);    // this descriptor is no longer needed

        exec(...);
    }
}

// parent

char buffer[1024];

close(pipefd[1]);  // close the write end of the pipe in the parent

while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
{
}

警告: 出力はミックスされます。すべてのプロセスが混合せずにデータをダンプするようにする場合は、プロセスを同期する必要があります (たとえば、公開ロックを使用)。

于 2012-09-28T18:55:24.147 に答える
0

ファイルシステムの任意の場所(ローカルソケットなど)に名前付きのchanelを作成し、受信したすべてのデータを親プロセスに読み取ることができると思います。そのため、子プロセスは取得したデータをこのチャネルに書き込む必要があります。UNIXライクなアーキテクチャになります。

于 2012-09-28T19:11:54.767 に答える