C++如何将数据写入stdin并从stdout获取输出

3

我有一个程序调用了一个tar命令,类似于popen("tar -zcvf")

我想要在stdin上写入并获得输出,类似于tar -zcvf - /path | tar -zxvf -

因此,一边封装目录中的文件并将它们通过stdout发送,另一边在反向进程中写入并发送到bash的stdout。

我想进行这个管道过程。

读取一个文件夹/文件,通过stdin发送内容以“提取”内容并读取二进制输出。

我想这样做,因为我可以通过套接字发送数据并在另一端提取,无需磁盘即时压缩和解压缩。

有人能帮我吗?

我发现需要使用execl...但是我找到的所有示例都是将子进程的stdout重定向到我的stdout。

我将执行类似以下的操作:

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
2个回答

5
你不能使用 popen 来完成这个任务,因为 popen 始终是单向的。你可以直接使用 pipefork 来设置类似的功能(但它比 popen 多了很多工作)。如果你这样做,你必须非常、非常小心。管道只能容纳有限的数据。试图写入更多数据时,写操作会等待空间可用。所以你很容易陷入这样一种情况:子进程正在等待你从输出管道中读取数据,以便在管道中创建更多空间,而你的进程正在等待子进程读取某些内容,以便在管道中腾出更多空间。我曾经做过一次类似的事情,但 sort 是循环中的其中一个程序——你可以确保 sort 不会在读取到输入流的结尾之前尝试写任何东西。

很酷,我需要通过网络发送许多千兆字节...大约100GB...哈哈 - Lefsler

1

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


我需要读取大量的数据,使用read命令可以实现吗? - Lefsler
抱歉,我误按了回车键。请提供需要翻译的英文内容。 - Lefsler
我可以用cin和cout来做到这一点吗?如果我需要压缩一个文件,我需要读取超过几千兆字节的数据,因此我需要从输入中读取一块数据并发送到输出。 - Lefsler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接