我正在尝试创建一个进程的二叉树,其中每个父进程通过管道连接到它的两个子进程。
问题:父进程 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;
}
}