2011-12-21 243 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