2017-08-27 99 views
0

假設我有一個程序,說「主」#0,再加上一些奴隸程序#1,#2,#3 ...,它們的工作方式是#n的輸出是通過#n + 1閱讀。我得到#0打開一個管道的bash shell這樣所有從程序設置,以便(非常像這樣的C代碼)運行:管道到Bash在C

PROGRAM#0:

... 
pipe=popen("bash","w"); 
fprintf(pipe,"./program#1 \n"); 
fprintf(pipe,"./program#2 \n"); 
fprintf(pipe,"./program#3 \n"); 
. 
. 
. 
... 

然後,由於奴隸需要更多的時間才能完成所有的「fprintfs」命令,計算機如何管理命令行的積累?有沒有緩衝區可以填充?而且,如果我在每個fprintf命令之後寫下「fflush(pipe)」,我是否會保證命令以正確的順序傳遞以便打擊?這是否安全?

+0

如果程序#1正在從程序#0讀取管道,它將阻塞,直到它能夠讀取一些數據。是的,有一個管道緩衝區。不,你正在做的方式,程序#N不會被讀入程序#的輸出N-1 –

回答

1

你只是做發行殼的等效命令

% ./program#1 
% ./program#2 
% ./program#3 

你是不是重定向任何輸入或輸出。

你似乎需要的是使用呼叫

popen("bash -c './program#1 | ./program#2 | ./program#3'", "w") 

(儘管這看起來像是會比一個C程序的shell腳本來容易做,老老實實)

+0

我不知道的等價 - 但正在發生的事情肯定不是什麼都想和'POPEN ()'或多或少似乎是合理的,儘管你可能只需要使用'FILE * p_write = popen(「./ program#1 | ./program#2 | ./program#3」,「w」0;'而不是添加一個額外的'bash'調用 –

+0

是的,你是對的,沒有任何bash調用的理由,也不是popen()的理由 - 他之前使用它來給bash命令,而不是。節目#1我想'系統(」 ./程序#1 | ./program#2 | ./program#3" )'可能是最好的滿足他們的需要。 – Jabberwock