4

popen()Wait()を失うことなくからの出力を抑制する方法はありますか?

テスト1:

FILE * stream = NULL;
char buffer [120];

stream = popen ("ffmpeg -y -i test.amr -ar 16000 test.wav -v quiet", "r");

while (fgets (buffer, sizeof(buffer), stream))
{
}

pclose (stream);

テスト2:

FILE * stream = NULL;
char buffer [120];

stream = popen ("ffmpeg -y -i test.amr -ar 16000 test.wav -v quiet &> /dev/null", "r");

while (fgets (buffer, sizeof(buffer), stream))
{
}

pclose (stream);

テスト2の問題pclose()は、パイプが処理を終了するのを待たないことです。パイプを実行するたびにFFMPEG出力を大量に出力したくありません。

4

2 に答える 2

2

子プロセスにデータを送信したり、子プロセスからデータを読み取ったりする場合にのみ使用する必要がpopen()あります(これは排他的論理和です。両方を実行する場合は、自分で接続を設定する必要があります)。

それをしたくない場合は、を使用しないでくださいpopen()

jim mcnamaraが正確に説明したように、パイプが作成された後に子の出力をリダイレクトすると/dev/null、リダイレクトはプログラムへのパイプ入力を閉じるため、popen()読み取りにゼロバイトを取得します。これはEOFとしてカウントされます。そして、それは戻ります-それ以上読むことはありません(それ以上あるかもしれないなら、それはEOFを受け取っていなかったでしょう)。

このコンテキストでは、system();を使用します。子の出力がにリダイレクトされた場合でも、子が終了するのを待ち/dev/nullます。fork()他のコンテキストでは、代わりに下位レベルのexec*()ルーチンを使用することが適切な場合があります。

于 2012-02-18T01:51:28.693 に答える
1

/ dev / nullへの出力は、popen(read()を呼び出している)がstdoutの閉じたファイル記述子をブロックしないことを意味します。すぐに戻ります。

stdoutをリダイレクトして効果的に閉じました(dup())。実際にはEOFを返します。

于 2012-02-18T01:23:26.063 に答える