我正在嘗試創建一個進程的二叉樹,其中每個父進程通過管道連接到其兩個子進程。如何管理上升的管道和管道沿進程的二叉樹?
問題:父進程A創建兩個進程(B和C)和兩個管道,每個進程一個進程。他們的文件描述符被存儲到fd中。在第二次迭代中,B產生了兩個孩子。 B用新管道的文件描述符覆蓋存儲在fd中的文件描述符。在產卵了n個關卡之後,剩下的唯一管道就是父母的葉節點(上一層)。
我已經測試了這個理論,唯一傳達的東西是在樹的底部,葉到上一層之間。我必須做到這一點,因此葉節點可以在樹的主進程中進行通信。
我是新來的管道,所以我可以關閉我的解釋。
我的理解是否正確,我該如何解決此問題?
示例代碼:
#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;
}
}
希望你不需要太多的過程。製作一棵小樹可能是可以的,但試圖構建一個擁有數千個獨立進程的樹可能不會擴展。 –
看來你並沒有將管道跟蹤到任何地方的父進程?除根和葉以外的每個進程都需要跟蹤三個管道 - 每個子進程一個,其父進程一個。 – twalberg
爲了跟蹤管道上升,我應該使用dup2嗎?例如:父母的左側閱讀將相當於左側孩子的寫作管道。那是對的嗎? –