1

別のプロセスで popen() を実行するアプリケーションで作業しています。このプロセスの出力 (stderr と stderr の両方) を、アプリケーションによって作成された 2 つの名前付きパイプにリダイレクトする必要があります。次に、パイプからデータを読み取る必要があります。

mkfifo("output.fifo", 0666); // error checks etc.
mkfifo("error.fifo", 0666); // error checks etc.
popen("cstuff 'param' < input.txt 1> output.fifo 2> error.fifo", "r");

動作しません: error.fifoから読み取ろうとすると、アプリケーションがハングします。sleep()ing / wait()ing betweenmkfifo()popen()も機能しません。

// output.txt is the result from a file dialog
popen("cstuff 'param' < input.txt 1> output.txt 2> error.fifo", "r");

動作します。

popen("cstuff 'param' < input.txt 1> output.fifo", "r");

も機能します。

$ cstuff 'param' < input.txt 1> output.txt 2> output.txt

シェルからも機能します(ただし、私のアプリケーションからは機能しません)。

両方のパイプからの読み取りを機能させる簡単な (または任意の) 方法を見つけることができませんでした。それはどのように達成できますか?

4

2 に答える 2

1

;system(3)の代わりに試してみてください。返された frompopen(3)を使用していません。使用されることを意図したとおりに使用していないためです。しかし、これは からうまくいくはずです。FILE*popen(3)popen(3)system(3)

于 2011-03-22T12:34:29.910 に答える
1

output.fifo と error.fifo の両方のファイル記述子で poll() または select() を呼び出し、データの準備ができている場合にのみ read() を呼び出す必要があります。

醜い名前付きパイプの代わりにpstreamを使用することをお勧めします。

于 2011-03-22T12:37:42.137 に答える