Я пытаюсь записать стандартный вывод 2 дочерних процессов в стандартный поток 3-го дочернего процесса, и у меня возникают проблемы с получением второго процесса для одновременной записи в процесс. Здесь процесс 3, где проблема. Стандартный ввод с клавиатуры не работает одновременно со стандартным вводом из процесса 2.
void read_keyboard() {
while (!std::cin.eof()) {
std::string line;
std::getline(std::cin, line);
std::cout << line << std::endl;
}
}
int main (int argc, char **argv) {
std::vector<pid_t> k;
pid_t child_pid;
int p1 [2];
pipe(p1);
//Fork that starts process 1 and pipes stdout to process 2
child_pid = fork();
if (child_pid == 0){
close(p1[0]);
dup2(p1[1], STDOUT_FILENO);
close(p1[1]);
//Start process 1. Process 1 runs continuously outputting to stdout.
}
//Fork that starts Process 2. Gets stdin from process 1 pipe and pipes stdout to process 3.
int p2 [2];
pipe(p2);
int p3 [2];
pipe(p3);
child_pid = fork();
if (child_pid == 0){
dup2(p1[0], STDIN_FILENO);
close(p1[1]);
close(p1[0]);
dup2(p2[1], STDOUT_FILENO);
close(p2[0]);
close(p2[1]);
//Start Process 2. This takes input from process 1 as stdin and outputs to process 3 as stdout.
}
//Fork that starts Process 3 and takes stdin from process 2 and read_keyboard(function that reads input until EOF)
child_pid = fork();
if (child_pid == 0) {
dup2(p3[0], STDIN_FILENO);
close(p3[1]);
close(p3[0]);
close(p2[1]);
dup2(p2[0], STDIN_FILENO);
close(p2[0]);
//Start process 3. Reads stdin from process 2 to run, can also take stdin from keyboard. Outputs straight to the terminal.
}
//Fork that starts read_keyboard and pipes stdout to process 3
child_pid = fork();
if (child_pid == 0) {
dup2(p3[1], STDOUT_FILENO);
close(p3[0]);
close(p3[1]);
read_keyboard();
}
dup2(p3[1], STDOUT_FILENO);
close(p3[0]);
close(p3[1]);
int status;
wait(&status);
//kill all the processes
}
У меня проблема в том, что все работает, пока вы не попытаетесь читать с клавиатуры. Входные данные просто зависают до тех пор, пока не завершится процесс 3, а затем он попытался записать в процесс 3. Может ли дочерний процесс обрабатывать 2 канала, которые одновременно записывают в свой стандартный ввод? Это концептуально имеет смысл для меня, но я не могу заставить его работать. Любая помощь будет оценена.