これは基本的な質問だと思いますが、答えを見つけることができませんでした。
私は C++ で Web サーバーを構築しています。実行中のシステムを視覚化するために、視覚化を行うための別のプログラムを構築しています。Web サーバーは、ビジュアライザーにパイプされた stdout にステートメントを出力することにより、ビジュアライザーに現在の状態を通知します。これにより、入力が解析され、さまざまな統計情報と共にシステム全体の優れた概略図がレンダリングされます。ビジュアライザーは Python で作成されます。
パイプがどのように機能するかを理解していることを確認するために、2 つの簡単なプログラムを作成しました。
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!\n";
return 0;
}
、 と
#include <iostream>
using namespace std;
int main() {
char buf[128];
while (!cin.eof()) {
cin.getline(buf, 128, '\n');
cout << "Received line: " << buf << "\n";
}
return 0;
}
コマンドを実行すると、これは期待どおりに機能します
./one | ./two
ただし、次のように Web サーバーを実行すると、次のようになります。
./aril | ./two
出力がまったく得られません。
サーバーを単独で実行すると、次のような出力が生成されます。
Spawning handlers
Waiting for HTTP clients
Server: got connection from 127.0.0.1, port 52168
Connection timed out
(明らかに、これは実際にビジュアライザーに渡す種類の出力ではありません。より簡単に解析できる構文が必要になります)。
おそらく関連する情報:
Web サーバーは、aril と arild の 2 つのプロセスに分かれています。aril は root 権限で実行されますが、arild はそうではありません。どちらのプロセスも、std::cout を使用して stdout に出力します。
これが機能しない理由は考えられません。
編集:解決策は、出力を明示的にフラッシュすることです。私が実際に試した最初のことだったはずです..