将数据写入管道C ++

时间:2011-12-26 15:33:48

标签: c++ process pipe stdin

我需要做类似

的事情
echo "data" | cat

使用

echo "data" | my program

在我的程序中调用cat并将我的stdin发送到cat stdin并从cat获取stdout。

我已经分叉了进程,关闭了write和read,dup2和execl .. 所以我可以从中获取stdout,如果我执行一个execl(“/ bin / sh”,“sh”,“ - c”,“ls -lahtr”,NULL)我可以将文件列表作为输出。< / p>

但我不知道如何发送数据,比如发送我从stdin读取的echo数据并发送到execl(“/ bin / sh”,“sh”,“ - c”,“cat” ,NULL)stdin并返回我的echo字符串。

#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;
}

使用此代码,我可以将一些数据发送到程序并在屏幕上写入,我想知道如何获取stdout并发送到一个变量。 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在fork之前使用两个pipe()调用。那些将是你被调用进程的stdin和stdout。在fork之后,在子进程中,将一个管道的写入端复制到stdout(1),将另一个管道的读取端复制到stdin(0)。关闭管道的未使用端,然后执行您的过程。

在父进程中,关闭未使用的管道fds。然后你将有一个fd,可以读取对应于孩子的标准输出的read(),以及一个可以写入的fd,对应于孩子的标准输入。