2017-08-27 12 views
0

"master"#0と、#nの出力が次のような方法で動作するいくつかのスレーブプログラム#1、#2、#3のプログラムを持っているとします。 #n + 1で読むことができます。以来、その後パイプラインをC言語でbashする

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

PROGRAM#0:私は、すべてのスレーブプログラムは、(非常にこのようなCコード)を順に実行するように設定されているbashシェルのパイプラインを開くために#0を取得しますスレーブは、すべての "fprintfs"コマンドを実行するためにマスターよりも時間がかかりますが、コンピュータがコマンドラインの蓄積をどのように管理していますか?充填するバッファーはありますか?そして、すべてのfprintfコマンドの後に "fflush(pipe)"を書き留めると、正しい順序でbashに渡されるコマンドが保証されますか?これはさらに安全ですか?

+0

(これは正直、Cプログラムよりも、シェルスクリプトで簡単に行うことが何かのように見えますが)コール

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

を使用することですプログラム#0からのパイプからの読み込みで、何らかのデータを読み込めるまでブロックされます。はい、パイプバッファがあります。いいえ、あなたがやっているように、プログラム#nはプログラム#n-1の出力を読みません。 –

答えて

1

あなたは、単にあなたが任意の入力または出力をリダイレクトされていないシェルコマンドに

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

を発行するのと同等を行っています。あなたがしたいように見える何

はプログラム#1の場合

+0

私は同値についてはわかりませんが、何が起こっているかは確かに望まれていません。 ()の代わりに 'FILE * p_write = popen(" ./ program#1 | ./program#2 | ./program#3 "、" w "0;')を使うことは可能でしょうが、 –

+0

bashコールの理由はまったくありません。popen()の理由はあまりありません。以前はbashにコマンドを供給するためにこれを使用していました。プログラム#1。私は、 'system(" ./ program#1 | ./program#2 | ./program#3 ")'がおそらくニーズに最も合っていると思います。 – Jabberwock