2011-12-21 188 views
3

获取输出我有一个程序调用一个焦油.. 像POPEN(“焦油-zcvf”)C++写的标准输入数据,并从标准输出

我想在标准输入写...并获得输出..类似 tar -zcvf -/path |焦油 - zxvf -

所以..一方面,我将封装从目录中的文件,他们发送低谷的标准输出和写反向进程..并发送到bash的标准输出。

我想这样做,管过程..

读取一个文件夹/文件和标准输入发送trought的“提取物”的内容和阅读的二进制输出。

我想这一点,因为我可以给trought套接字数据而无需盘,我压缩和解压实时的另一边提取..

有人能帮助我吗?

我看到我需要做execl ... 但我发现的所有例子都是将孩子的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 

回答

5

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

+0

很酷,我需要发送很多千兆字节.. +/- 100gb低谷网络..大声笑 – Lefsler 2011-12-21 14:01:13

1

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

+0

我需要读取大量的数据,它是否可以做到这一点阅读? – Lefsler 2011-12-23 11:58:51

+0

对不起,误按了回复。 – Lefsler 2011-12-23 11:59:16

+0

我可以用cin和cout来做到这一点吗?我需要读取超过千兆字节,如果我需要tar一个文件,我将需要从输入中读取一块数据并发送到输出。 – Lefsler 2011-12-23 12:00:06