2012-03-24 3 views
1

シェルコマンド(my_program)から出力を取得します。プログラムがまだからの出力を得るだけでなく、実行されている間、私は永久に私のプログラムを実行し、出力を取得したいC++で実行されているシェルコマンドの出力を永久に取得します

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main() { 
    FILE *in; 
    char buff[512]; 

    if(!(in = popen("my_program", "r"))){ 
     return 1; 
    } 

    while(fgets(buff, sizeof(buff), in)!=NULL){ 
     cout << buff; 
    } 
    pclose(in); 

    return 0; 
} 

問題:ここでthisサイトから取った例でありますプログラムを一度。

ありがとうございました。

+0

1)3つのパイプを開き、2)フォークオフ、3) 'dup2'とジグルファイル記述子、4)' exec'を子に入れます。 –

+0

あなたの質問はあまり明確ではありません - あなたは永久に何を意味しますか?なぜ、 'my_program'を '永久に'動かさないのですか? – trojanfoe

+0

@KerrekSB、私はすでにフォーク/スレッドの使用を考えていました。しかし、別のオプションがあるかどうかを知りたい。ご回答有難うございます。 –

答えて

0

あなたの質問はやや不明確であるが、私はこの問題は、バッファと回答フラッシュであると思われる:私は理解して道が時折プログラムmy_program生成出力し、ときmy_programプリントに何か行動にキックする必要があります示してプログラムです。さらに、私はこのプログラムが合計で多くの出力を生み出さないと考えています。 4k未満。

問題は、コンソールがコンソール出力に書き込むときにラインバッファになる傾向があり、他の宛先がかなり大きなバッファをバッファする傾向があるという点で、標準出力を異なる方法でバッファすることです。しかし、バッファを明示的にフラッシュすることができ、出力のパフォーマンスが大幅に低下します。もちろん、上記のシナリオでは、出力パフォーマンスよりもタイムリーな出力に関心があります。

out << std::flushを使用するために、C++で出力バッファをフラッシュする簡単な方法です。この問題をすぐに確認したい場合は、out << std::unitbufを使用して、すべての出力操作後にストリームをフラッシュするように設定できます。自動的にフラッシュする方法はいくつかありますが、これらはもう少し複雑です。

関連する問題