Я пытаюсь создать двоичное дерево процессов, в котором каждый родитель подключен к своим двум дочерним элементам через каналы.
Проблема: Родительский процесс 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;
}
}