Записать данные в канал C ++ - PullRequest
1 голос
/ 26 декабря 2011

мне нужно сделать что-то вроде

echo "data" | cat

Использование

echo "data" | my program

И внутри моей программы вызывается кошка и отправляет мой стандартный ввод в стандартный вывод кошки и получает стандартный вывод от кошки.

Я уже разветвляю процесс, закрываю запись и чтение, dup2 их и исполняю .. Так что я могу получить стандартный вывод из него, если я выполню один execl ("/ bin / sh", "sh", "-c", "ls -lahtr", NULL), я могу получить список файлов в качестве вывода.

но я не знаю, как отправлять данные, например отправлять эхо-данные, которые я читаю из моего стандартного ввода, и отправлять их в execl ("/ bin / sh", "sh", "-c", "cat" , NULL) stdin и верните мою строку эха.

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    int ficheiro_fd;
    int pipe_fd[2];
    char buffer[20];
    int num_bytes;

    pipe(pipe_fd);

    switch ( fork() ) {
    case -1:
        exit(1);
    case 0:
        close(pipe_fd[1]);
        dup2(pipe_fd[0], 0);
        execlp("/usr/bin/base64"," ", NULL);
        break;
    default:
        close(pipe_fd[0]);
        //ficheiro_fd = open("output.txt", O_RDONLY);
    while ((num_bytes = read(fileno(stdin), buffer, 1)) > 0){
            write(pipe_fd[1], buffer, num_bytes);
            }
        close(pipe_fd[1]);
        wait((int*)getpid());
    }

    return 0;
}

С помощью этого кода я могу отправить некоторые данные в программу, и она пишет на экране, я хочу знать, как я могу получить стандартный вывод и отправить в одну переменную. Спасибо за помощь, чел.

1 Ответ

1 голос
/ 26 декабря 2011

Используйте два вызова pipe () перед форком. Это будут stdin и stdout вашего вызванного процесса. После разветвления в дочернем процессе дублируйте конец записи одного канала в stdout (1) и конец чтения другого канала в stdin (0). Закройте неиспользуемые концы канала, затем выполните ваш процесс.

В родительском процессе закройте fds неиспользуемого канала. Затем у вас будет fd, из которого можно прочитать с помощью read (), соответствующего stdout ребенка, и fd, в который можно записать, соответствующий stdin ребенка.

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