@temp_str

Эмуляция пользовательского ввода и считывание вывода из программы (pipe, C++)?

Приветствую.

Мне необходимо запустить стороннюю консольную программу, которая читает пользовательский ввод через std::cin, после чего отдает результат, который необходимо спарсить. Я так понимаю, что в *nix это осуществляется через pipes. Расскажите, пожалуйста, как это вообще возможно реализовать?

int fd[2];
pipe(fd);
pid_t pid_fork = fork();
if(!pid_fork)
{
    // Дочерний процесс
}
else
{
    // Родительский процесс
}


При инициализации пайпа мы имеем 2 выхода трубы - ввод и вывод. При вводе в правый конец трубы (1), вывод мы можем получить на левом (0). Я пытался запустить программу через execl в дочернем процессе, но, дальше у меня вообще нет идей, как мне передать на вход программы пользовательский ввод (понятно, что через write), а потом где и как получить вывод программы.

execl("/bin/sh", "sh", "-c", "../sample/main", NULL);
  • Вопрос задан
  • 4936 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
#include <unistd.h>

int main()
{
        int fd[2][2];
        pipe(fd[0]);
        pipe(fd[1]);
        pid_t pid_fork = fork();
        if (!pid_fork) {
                // Дочерний процесс
                close(fd[0][1]);
                close(fd[1][0]);
                dup2(fd[0][0], STDIN_FILENO);
                dup2(fd[1][1], STDOUT_FILENO);
                execl("/bin/tr", "/bin/tr", "l", "r", NULL);
        } else {
                // Родительский процесс
                close(fd[0][0]);
                close(fd[1][1]);
                char buf[1000];
                ssize_t sz;

                write(fd[0][1], "hello, world\n", sizeof("hello, world\n") - 1);
                close(fd[0][1]);
                sz = read(fd[1][0], buf, sizeof(buf));
                if (sz > 0) {
                        write(STDOUT_FILENO, buf, sz);
                }
        }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы