【问题标题】:C++ write data on stdin and get output from stdoutC++ 在标准输入上写入数据并从标准输出获取输出
【发布时间】:2012-01-25 06:34:10
【问题描述】:

我有一个程序调用一个 tar.. 类似 popen("tar -zcvf")

我想在标准输入上写……然后得到输出……像 焦油 -zcvf - /路径|焦油-zxvf-

所以..一方面我将封装目录中的文件,然后它们通过标准输出发送并在逆过程中写入..并发送到 bash 的标准输出。

我想做这个管道过程..

读取一个文件夹/文件并将标准输入发送到“提取”内容并读取二进制输出。

我想要这个,因为我可以发送经过处理的套接字数据并在另一端提取而不需要磁盘,我实时压缩和解压缩..

有人可以帮助我吗?

我看到我需要执行... 但我发现的所有示例都是将孩子的标准输出重定向到我的。

我会这样做:

LOOP.
1 Get block of data from stdin
2 Send to child program
3 get the output
4 Do something with the data (send back trough socket)
END_LOOP

OR
LOOP
1 Get block of data from stdin.
2 Send to child program.
END_LOOP
LOOP
1 Get block of data from child program
2 Do something with the data (send back trough socket)
END_LOOP

【问题讨论】:

    标签: c++ stdout pipe stdin popen


    【解决方案1】:

    您不能为此使用popenpopen 始终是单向的。你 可以直接使用pipefork 按照这些思路进行设置 (但它比popen 要做更多的工作)。但是,如果你这样做了,你有 要非常非常小心。管道只能容纳有限数量的数据。 尝试写更多,写等到空间可用。所以 您很容易陷入子进程正在等待的情况 让您在其输出管道上阅读一些内容,以便创建更多 管道中的空间,您的进程正在等待孩子阅读 让教皇有更多的空间。我已经做到了 过去曾经,但sort 是 循环——并且保证sort 不会尝试写任何东西 直到它在其输入中看到文件结尾。

    【讨论】:

    • 酷,我需要发送很多千兆字节.. +/- 100gb 槽网络.. 哈哈
    【解决方案2】:

    std::cinstd::cout 是你的朋友。

    【讨论】:

    • 我需要读取大量数据,用 read 可以做到吗?
    • 对不起,按错了返回。
    • 我可以用 cin 和 cout 做到这一点吗?我需要读取超过千兆字节,如果我需要 tar 一个文件,我需要从输入读取数据块并发送到输出。