Я пытаюсь настроить программу, которая использует межпроцессное взаимодействие для связи между четырьмя процессами, используя pipe / execl.Это часть домашней работы, чтобы продемонстрировать использование каналов, но у меня возникли некоторые трудности, когда я оборачиваюсь вокруг нее (то есть, как растет дерево процессов).Эти процессы должны быть экземплярами двоичных файлов в моей системе, следовательно, использование execl.Чтобы дать краткий обзор того, что я пытаюсь выполнить, я хочу перенаправить стандартный ввод из общего родительского процесса / программы в подпроцесс, называемый «s» (который является двоичным в моей системе, называемый сканированием), который интерпретирует слова,В «s» / scan он обрабатывает слова из своего стандартного ввода, а затем, в зависимости от слова, отправляет / записывает слово либо одному процессу («e»), либо другому процессу («o»).Процессы ввода / вывода на самом деле являются одним и тем же двоичным файлом, который просто имеет символические ссылки на них - он в основном делает то же самое.
Как бы я структурировал свою вызывающую / родительскую программу, чтобы структурировать это?Мне нужно создать все процессы в этой основной программе, иначе я бы просто создал два подпроцесса в процессе сканирования / s.Ниже приведен код, который я написал для перенаправления стандартного ввода основной программы в процесс "s", но я не уверен, куда нужно форкировать два подпроцесса, которые будут к нему подключаться.Я думаю, что было бы лучше получить pid двух других подпроцессов, которые мне нужно создать в дополнение к процессу "s" / scan, и вызвать в качестве аргументов соответствующие двоичные файлы с разными pids, но я не уверен.Любая помощь будет высоко ценится!
int s_to_e[2]; int s_to_o[2];
int e_to_s[2]; int o_to_e[2];
pid_t e_pid; pid_t o_pid; pid_t s_pid;
if (pipe(s_to_e)) {
exit(1);
}
if (pipe(s_to_o)) {
exit(1);
}
if ( (s_pid = fork()) == -1) {
fprintf(stderr, "Fork error! \n");
exit(1);
}
int status;
//Child progress of scan
if (s_pid == 0) {
//Redirect stdin to s
//This probably isn't the best way to go about doing this
dup2(0, s_to_e[0]);
close(s_to_e[1]);
//We need to replace the child fork with a new process
if(execl("./scan", "./scan", NULL ) == -1) {
printf("execl Error!");
exit(1);
}
} else {
printf("I am parent\n");
wait(&status);
printf("Done\n");
}