Я работаю над проектом, и я понял его главным образом, за исключением одной незначительной (большой) проблемы. Кажется, я не могу понять, как создавать каналы между любым количеством детей.
например, я беру аргументы командной строки, чтобы определить, сколько потомков будет создано. Первый дочерний элемент не имеет входных данных, но имеет выходные данные, а последний дочерний элемент выводит на выход STD Мне нужно передать значения в первого ребенка и каждого ребенка после этого по порядку. Вот что я получил:
#include <errno.h>
#include <cstdio>
#include <iostream>
#include <sys/wait.h>
using namespace std;
int main(int argc, char *argv[]) {
pid_t childpid;
int x2ypipe[2];
pipe(x2ypipe);
if(x2ypipe==0) {
cout<<"ERROR:"<<errno<<endl;
}
int y2zpipe[2];
pipe(y2zpipe);
if(y2zpipe==0) {
cout<<"ERROR:"<<errno<<endl;
}
pid_t xchild =fork();
if(xchild==0) {
dup2(x2ypipe[1],STDOUT_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
int a=execl(argv[1],argv[1], (char*)NULL);
if(a==-1) {
perror("The following error occurred at A");
}
}
for(int i=2; i<(argc-1); i++) {
childpid =fork();
if(childpid==0) {
dup2(x2ypipe[0],STDIN_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
//direct y2z pipe to standard output and replace the child with the program part2
dup2(x2ypipe[1],y2zpipe[1]);
dup2(y2zpipe[1],STDOUT_FILENO);
close(y2zpipe[0]);
close(y2zpipe[1]);
int b=execl(argv[i],argv[i],(char *)NULL);
if(b==-1) {
perror("The following error occurred at B");
}
}
}
pid_t zchild =fork();
if(zchild==0) {
dup2(y2zpipe[0],STDIN_FILENO);
close(y2zpipe[0]);
close(y2zpipe[1]);
int c=execl(argv[argc-1],argv[argc-1],(char *)NULL);
if(c==-1) {
perror("The following error occurred at C");
}
}
close(x2ypipe[0]);
close(x2ypipe[1]);
wait(NULL);
wait(NULL);
wait(NULL);
}
сейчас я передаю только три программы в argv [], и все работает нормально. Мне придется добавить оператор if в цикл for, чтобы проверить последнее / максимально возможное значение i для соединения канала y2z с zchild. Что я испытываю затруднения, делая это, соединяя детей друг с другом в цикле for. Как мне создать новую трубу для каждого ребенка из последнего ребенка?