4

Linux の単純なマルチプロセス プログラム。./findPrime 10 20 30 のような数値を入力します。プログラムは 3 つの子プロセスを作成して、2 ~ 10、10 ~ 20、20 ~ 30 の間のすべての素数を見つけます。子プロセスが素数を見つけると、パイプを介して「2 は素数です」と書き込み、親プロセスに送信します。親はそれを画面に印刷します。ここでの問題は、while ループを使用してパイプにメッセージを書き込み、親側で別の while ループを使用してメッセージを受信することですが、以下のコードでは最初のメッセージしか表示されないため、進行中です。どうすればそのパイプから読み続けることができますか? 私は何かを逃しましたか?どうもありがとう!

char readBuffer[100];
char outBuffer[15];
int pids[argc]; 
int fd[2];
pipe(fd);

for(i = 0; i < argc; i++)
{
    if( i == 0)
        bottom = 2;
    else
        bottom = args[i - 1];
    top = args[i];

    pids[i] = fork();

    if(pids[i] == 0)
    {
        printf("Child %d: bottom=%d, top=%d\n", getpid(), bottom, top);

        close(fd[0]);

        j = bottom;
        while(j <= top)
        {
            int res = findPrime(j);

            if(res == 1)
            {
                sprintf(outBuffer, "%d is prime", j);
                write(fd[1], outBuffer, (strlen(outBuffer)+1));
            }

            j++;
        }

        exit(0x47);
    } 
    else if(pids[i] < 0)
    {
        fprintf(stderr, "fork failed!  errno = %i\n", errno);   
        break;
    }
    else
    {
        close(fd[1]);
        while((nbytes = read(fd[0], readBuffer, sizeof(readBuffer))) > 0 )
            printf("%s\n", readBuffer);

        int status = 0;
        pid = waitpid(pids[i], &status, 0);

        if(pid >= 0)
            printf("Child %d exited cleanly\n", pid);
    }
}

そして、これらの子プロセスは、プロセス 1 が完了したときにプロセス 2 が実行され、プロセス 3 が 2 の後に実行されるように、作成された順序で実行する必要があります。

4

1 に答える 1

6

親/子は、fork. 当面の問題は、親で fd[1] を閉じることです。最初の子が終了すると、プロセスが終了するということは、子で fd[1] が自動的に閉じられることを意味します。OS にはファイル記述子への有効な参照がなくなったため、無効になります。したがって、パイプの書き込みは、後続のすべての子で失敗します。

したがって、親で fd[1] を閉じないでください。

しかし、他の問題もあります。飛び出すのは、子プロセスの1つが素数を見つけられない場合、パイプに書き込むことは決してないということです。ただし、親は、決して到着しない何かが読み取られるのを待って、永久にブロックします。親で fd[1] を閉じないと、EOF が表示されなくなります。つまり、親で read() == 0 になります。したがって、解決策の 1 つは、「完了」メッセージをパイプ経由で戻し、親にそれを解析させることです。

より良い解決策は、再設計を検討することです。プログラムの冒頭でコマンドライン引数を解析することにより、必要になるプロセスの数を数えます。次に、必要になる数のパイプ記述子のスペースを動的に割り当て、各プロセスに独自のペアを与えます。それはすべてを完全に回避することができ、物事を行うためのより標準的な方法です.

于 2013-09-23T03:01:37.137 に答える