0

各親がパイプを介して 2 つの子に接続されているプロセスのバイナリ ツリーを作成しようとしています。

問題: 親プロセス A が 2 つのプロセス (B と C) と 2 つのパイプ (プロセスごとに 1 つ) を作成します。それらのファイル記述子は fd に格納されます。2 回目の反復で、B は 2 つの子を生成します。B は、fd に格納されているファイル記述子を新しいパイプのファイル記述子で上書きします。n 個のレベルを生成した後、残っているパイプは、親へのリーフ ノード (1 レベル上) だけです。

私はこの理論をテストしましたが、伝達されるのは、ツリーの最下部、リーフから 1 つ上のレベルまでの間だけです。リーフ ノードがツリーのずっと上にあるマスター プロセスと通信できるようにする必要があります。

私はパイプに慣れていないので、説明についてはずれている可能性があります。

私の理解は正しいですか? また、この問題を解決するにはどうすればよいですか?

サンプルコード:

#define READ 0
#define WRITE 1

int fd[2][2];

void
spawnChildren(int levels)
{
    if(levels == 0)
       return;

    pipe(fd[0]);
    //spawns 2 children at a single parent
    int pid = fork();
    //parent
    if(pid > 0)
    {
        close(fd[0][WRITE]);
        pipe(fd[1]);
        int pid2 = fork();
        //child B
        if(pid2 == 0)
        {
            close(fd[1][READ]);
            spawnChildren(levels-1);
            return;
        }
        //parent
        else
            close(fd[1][WRITE]);
    }
    //child A
    else
    {
        close(fd[0][READ]);
        spawnChildren(levels-1);
        return;
    }
}
4

2 に答える 2

0

私の理解が正しければ、ルート プロセスは2 つの fd を開いて、その 2 つの子と通信しています。次に、他の独立したパイプを開きます。

ルート プロセスは、甥っ子が4歳のときにどのように通信できるでしょうか。

すべての fd を開いたままにしておく必要があります。各プロセスは、その子から入力を取得し、それを親に渡す必要があります。それらを整理するには、ある種のプロトコルが必要です。データがダウンする場合も同様です。

たとえば、ルートの親は、左の子の右の子の左の子と通信したいと考えています。

  • RL.HELLO WORLD を左の子に送信します
  • 左の子は R を見て、#L.HELLO WORLD を右の子に送信します。
  • 右の子は #L.HELLO WORLD を受け取り、##.HELLO WORLD を左の子に送信します。
  • 左の子は ##.HELLO WORLD を受け取り、メッセージがそれに対するものであることを知っています

  • 左の子は、##.I HEAR YOU を親に送信して応答します

  • 親は左の子が話しているのを見て、最後の # を L に変換して送信します
  • 親は、右の子が #LI HEAR YOU と言っているのを見て、RL.I HEAR YOU を送信します。
  • ルートは左の子から RL.I HEAR YOU を受け取り、誰がそれを作成したかを知っています。

もちろん、その時点で、各プロセスには着信メッセージと発信メッセージのキューも必要です。

ルートとリーフ間の通信だけでも、キューとメッセージ パッシングが必要になります。「R#L」プロトコルなしで行うことしかできませんが、その単純さを考えると、それは非常に小さな節約です.

于 2012-10-03T20:21:59.580 に答える
0

必要なのは、1 つのスレッドまたはプロセスが各パイプをリッスン (読み取り) し、それを対応するパイプに書き込むことです。基本的に、各「ノード」には、これを行う 2 つのスレッドまたはプロセス (各子に 1 つずつ) が必要です。

これはあまりスケーラブルではありません。何をしようとしているのかによっては、もう少しうまく設計できない場合は再評価する必要があるかもしれません。1 つの提案は、リーフ ノードがパイプの代わりに一時ファイルに書き込み、トップ レベルがそれらのファイルを、フォークを介してこれらすべてのパイプを管理しようとする代わりにインテリジェントに読み取るようにすることです。これを行うと、「ノード」の数を大幅に削減できます。ただのアイデア。

于 2012-10-03T20:46:24.317 に答える