さて、私はパイプに関して完全に固執している任務です。目標は、コマンドラインから「深さ」「ファイル名」と「属性」を取り込むことでした。このファイルは、ユーザー情報を保持する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);
}