4

さて、私はパイプに関して完全に固執している任務です。目標は、コマンドラインから「深さ」「ファイル名」と「属性」を取り込むことでした。このファイルは、ユーザー情報を保持するtxtファイルであり、属性は、後で並べ替える情報です。ただし、ユーザーが入力した数に基づいてフォークを使用してバイナリツリーを作成する必要があるため、深さは重要です。深さが1の場合、メインプロセス、1つの内部ノード、および2つのリーフノードがあります。深さが2の場合、メインプロセスがあります。1つの内部ノードには子として2つの内部ノードがあり、それぞれに子として2つのリーフノードがあります...など。

私のコードは現在、すべての情報を構造体の配列に読み込み、正しい数のノードのバイナリツリーを作成し、すべての並べ替えアルゴリズム(Shell、Quick、Bubble)が機能します。

ここで、名前付きパイプを実装し、データをリーフノードに渡して並べ替える必要があります。各内部ノードは、データをその子に分割することになっています。次に、データがリーフノードに到達すると、別の並べ替えアルゴリズムを実装し、結果を親/内部に返します。内部ノードは、2つの子からソートされたデータを取得し、結果をマージします。最終的に、データはアンカーノードに完全にマージされます。

私の問題は、パイプに頭を悩ませることができないことです。それらを追跡する方法や、適切なタイミングで初期化する方法がわかりません。与えられた深さによって生成されるリーフノードの数を見つけ、そのようにデータを均等に分割し、データの各部分で正しいソーターを実行するためにifステートメントを作成することを考えましたが、それでは正しい解決にはなりません。問題。誰かが私がこれを実装するのを手伝ってくれる、または少なくとも最初に何かを手伝ってくれる?

ツリーの作成は次のようになります

void forkTree(int size){
if(size == 0){
    return;
}
int left = fork();
if(left != 0){
    int right = fork();
        if(right == 0){
            sleep(1);
            forkTree(size-1);
        }
}
else{
    sleep(1);
    forkTree(size-1);
}

そしてそれはこのように呼び出されます

if(depth>0){
//initial fork
int anchor = fork();
//make binary tree only in child process
if(anchor==0){
    forkTree(depth);
}
4

1 に答える 1

0

についてのドキュメントを見てくださいpipe. 各パイプには 2 つの端があり、1 つは読み取り用、もう 1 つは書き込み用です。子にデータを書き込み、結果を読み取る場合は、子ごとに 2 つ必要です。二分木がある場合、各ノードに 2 つの子があります。したがって、親側と子側の両方で半分を閉じると、4 つのパイプと 8 つのファイル ハンドルになります。親ノードでは、子に書き込むパイプの読み取り側と、子から読み取るパイプの書き込み側を閉じます。子供では、あなたは反対のことをします。マニュアルページの例を見て、タスクに適応させることができます。1 つの子を fork するためのコードを別の関数に分けることをお勧めします。この関数で子にデータを書き込み、パイプの読み取り側のみを返すこともできます。次に、両方の子から両方のパイプから読み取ります。忘れないでwait両方の子供がゾンビを刈り取るために。

マニュアルページの例があります:

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

int
main(int argc, char *argv[])
{
    int pipefd[2];
    pid_t cpid;
    char buf;
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <string>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (cpid == 0) {    /* Child reads from pipe */
        close(pipefd[1]);          /* Close unused write end */

        while (read(pipefd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);

        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);

    } else {            /* Parent writes argv[1] to pipe */
        close(pipefd[0]);          /* Close unused read end */
        write(pipefd[1], argv[1], strlen(argv[1]));
        close(pipefd[1]);          /* Reader will see EOF */
        wait(NULL);                /* Wait for child */
        exit(EXIT_SUCCESS);
    }
}
于 2015-03-18T10:52:02.800 に答える