Я создал программу, которая создает 5 каналов и 5 процессов в цикле. Мне удалось отправить данные из родительского процесса в каждый дочерний процесс, когда каждый дочерний процесс перекрывается другой программой. Каждый цикл выполняется следующим образом
( parent.c ):
// Child process - reads from pipe
if (childpid == 0) {
dup2(fd[0], 0); // replace stdin with pipe input
execv("program", arguments);
} else { // Parent process - writes to pipe
write(fd[1], buffer, strlen(buffer)+1);
}
Так что теперь я могу получить данные, которые отправляются от родителя в канал, читая из STDIN_FILENO в программе, которую childs выполняет с execv (...).
Вот так ( program.c ):
char *buffer = (char *)malloc(50);
read(STDIN_FILENO, buffer, 50);
Однако моя проблема в том, как я могу отправить данные обратно родителю? Я думал о чем-то вроде замены stdout на трубу с помощью dup2 снова, но я не могу заставить его работать. Я понимаю, что это должно быть сделано до использования execv (...) по крайней мере.
Я не уверен, что этого объяснения было достаточно, чтобы я мог сделать небольшое изображение с текстом:)
Вот как сейчас:
- Родитель -> Труба
- Труба -> Дочерний процесс 1
- Труба -> Дочерний процесс 2
- Труба -> ...
- Труба -> Дочерний процесс 5
Я хочу, чтобы это было так.
- Родитель -> Труба
- Труба -> Дочерний процесс 1
- Труба -> Дочерний процесс 2
- Труба -> ...
- Труба -> Дочерний процесс 5
- Дочерний процесс 1 -> Родительский
- Дочерний процесс 2 -> Родительский
- ...
- Дочерний процесс 5 -> Родительский
Благодарю за помощь!