2011-02-09 14 views
3

QProcess子をいくつか起動し、次にQProcess::setChannelMode(QProcess::ForwardedChannels)を呼び出すQtアプリケーションがあります。私はこのアプリケーションのstdout(現在は子供のstdoutを含む)をログファイルに送りたいと思います。その場所はアプリケーションによって決まります。つまり、指定した場所に書き込むようにロギングを変更することはできませんこれは子供のためにはうまくいかず、app | tee logfileをどこに打つべきかわからないので実行できません。Qtアプリケーションでのファイルへのstdoutへの転送

私はそれが存在すれば(それがあれば見つけることができませんでした) - これをQt経由で行う方法ですが、他の解決策も受け入れられます。

答えて

1

大丈夫です。その出力を、すなわち彼らはすべてのファイルに書き込むことができるようになりますと意志 -

#include <cstdio> 
... 
QString logFile; 
... 
freopen(logFile.toLocal8Bit().data(), "w", stdout); 
+0

複数のプロセスが同時に書き込みを行う場合、これはうまくいくのではないでしょうか。 cライブラリ関数はロックを提供しません。具体的に要求されない限り、基礎となるOS APIがそのようなロック機構を提供するのではないかと疑います。この方法で問題が解決した場合は、ロギングが低い周波数でのみ発生するため、問題が発生する可能性は非常に高いです。 – smerlin

3

QProcess :: setStandardOutputFile()はそれだけではありませんか?

実際に自分

+0

は、複数のプロセスを持つ一つのファイルに対して、この作業はウィル:非Qtの解決策として、それは私がそれを必要なものを行いますfreopenのように見えます順次表示されますか? – spbots

+0

これらはおそらくすべて同じファイルに書き込むことができますが、基礎となるロックが使用されているかどうかわかりません。同時に実行された場合、プロセスからのメッセージが混在する可能性があります –

+0

QProcessメソッドの問題は です。私はQProcessとしてそれにアクセスできない(私は思っていません) 2)私は、複数のプロセスが同じファイルに書き込むとうまくいくとは思わない。 – Matt

1

これを行うには方法でこれをやったことがない申し訳ありませんが、この非常に単純な例のように、基礎となるstreambufを変更するには、次のようになります。http://www.cplusplus.com/reference/iostream/ios/rdbuf/

最高の方法ではないかもしれません、しかし、それは仕事を完了します。

+0

'std :: cout.rdbuf()'の変更のように見えるのは、 'std :: cout'に対して実行される操作 - printfや子プロセスからの出力に対してのみ機能します。例えば、転送されません。 – Matt

+0

@Matt、 'printf'コールは別のルートをとるでしょう。上記はcout/cerrなどでしか動作しません。IPCの何らかのフォームを実装するまでコヒーレントな出力は得られません。(下の' freopen'ソリューションでも)残念なことに、複数のプロセスから同じログファイルに書き込む場合は、ソケットなどで動作するカスタムロガーの形式を実装し、受け取った内容を単一のプロセスで処理する必要があります。あなたはまた、ブーストiostreamsライブラリを見ることができる... – Nim

関連する問題