0

これは基本的な質問だと思いますが、答えを見つけることができませんでした。

私は 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 に出力します。

これが機能しない理由は考えられません。

編集:解決策は、出力を明示的にフラッシュすることです。私が実際に試した最初のことだったはずです..

4

3 に答える 3

0

aril は、その出力がパイプされているかどうかを検出し (詳細については fstat() およびこのスレッドhttp://cboard.cprogramming.com/cplusplus-programming/73909-prevent-piping.htmlを参照)、サイレント モードに切り替えることができます。出力を生成しません。他の何かにパイプしてみてください。おそらく cat で、出力が生成されるかどうかを確認してください。

于 2013-06-12T22:49:49.807 に答える
-1

あなたのプログラムはペアとして機能するように設計されていると思いますが、互換性はありません。 ./one | ./twoはパイピングの例ですが、ソケット経由./arilで通信することを期待しています。./arild混ぜても意味がないのかもしれません./aril | ./two

于 2013-06-12T22:37:33.830 に答える