1

ジョブ キューを作成するアプリケーションがあり、複数のスレッドがジョブを実行します。それらを実行するとは、ジョブ文字列で system() を呼び出すことを意味します。

問題は、stdout への出力が質問の下部にある出力のように見えることです。各アプリケーションの実行を分離したいので、出力は次のようになります。

flac 1.2.1 ...
...
...

flac 1.2.1 ...
...
...

等

制御できないプログラムを使用しているため、IO をミューテックスでラップできません。

出力を上記のようにするにはどうすればよいですか?

fllaacc 11..22..11,, CCooppyyrriighhtt ((CC)) 2000,2001,2002, 2003,220004,2
005,0200,0260,0210,0270 0 2J,o2s0h0 3C,o2a004,2005,2l0s0o6n,
007f l aJco scho mCeosa lwsiotnh
 AfBl
OCL UcfToleEmaLecys 1Nw.Oi2t .hW1 A,AR BRCSAOONPLTYUYRT.IE GL HYTTH NI(OSC )W
i AsR2 R0fA0rN0et,eY2 .0s 0o 1ft,th2wi0as0r 2ei,,s2 0af0nr3de, e2y 0os0uo4 f,at
2rw0ea0
e,,2 0wa0en6ld,c 2oy0mo0eu7 ta orJ eor
hd iCswotearllicsboumnte
 tiotf lruaencdd iecsrot mrceiesbr utwtaieit nhi tca obunsndodileturit oecles
年 t Na OiT NYW PaceRo Rn`AdfNilTtaYic.o'n sft.oh ris std yeiptsea if`lrfsel
.ea
s
'f tfwor adreet,a iandl sy.ou
a
e
一定の条件下での再配布を歓迎します。詳細については、「flac」と入力してください。
4

4 に答える 4

4

system().. を使用する代わりに、 popen()を使用できます。次に、親プログラムで各子の出力から読み取り、必要なことを行います (たとえば、各行を出力するときにいくつかのミューテックスで同期します)。

于 2010-01-04T00:18:24.190 に答える
0

pnm と Duck が書いたことに加えて、外部プログラムの man ページを調べて、不要な出力をどのように抑制できるかを調べてください。

そして、最後の手段として、シェルを介して出力を抑制することができます。

system("flac ... > /dev/null");または標準出力と標準エラー出力:system("flac ... 2>&1");

于 2010-01-04T01:23:29.423 に答える
0

popen() が最良の解決策だと思いますが、少し手間がかかるかもしれません。

簡単な解決策は、各アプリケーションの出力を tmp ファイルにリダイレクトすることです。
次に、すべてのスレッドが終了したら、tmp ファイルを標準出力にコピーします。

system("plop > tmp1");
于 2010-01-04T01:24:21.107 に答える
0

pnm が指摘しているように、 popen() はおそらく最善の方法です。パイプを介して読み取ったすべてを保存し、最後に、他の popen() 呼び出しの出力に散在させることなく、保存する予定の場所に書き込む必要があります。

醜く効率的ではありませんが、おそらくより簡単な方法は、出力をファイルにリダイレクトするように system() ジョブを設定することです。次に、ファイルの内容全体を出力に追加し、一時ファイルを削除する system() 呼び出しが完了した後にファイル名を渡すスレッドを作成できます。

または両方の変形。popen() を使用し、パイプ読み取りの結果をメモリのどこかに保存し、popen 呼び出しが完了したときにメモリ アドレスを出力スレッドに渡します。

于 2010-01-04T01:01:41.340 に答える