2 канала записи в STDIN одного и того же дочернего процесса - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь записать стандартный вывод 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 канала, которые одновременно записывают в свой стандартный ввод? Это концептуально имеет смысл для меня, но я не могу заставить его работать. Любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...