コンソールに 4 行の出力を出力し、クライアント プログラムからの着信接続のリッスンを開始する 1 つのプログラム (サーバー) があります。
サーバーから標準出力を読み取って分析する別のプログラム (テスター) があります。サーバーを起動し、次のように出力を取得するテスター プログラムをセットアップしました。
Process server = new Process();
server.StartInfo.FileName = "server.exe";
server.StartInfo.UseShellExecute = false;
server.StartInfo.RedirectStandardInput = true;
server.StartInfo.RedirectStandardOutput = true;
server.StartInfo.RedirectStandardError = true;
server.Start();
StreamReader serverOutput = server.StandardOutput;
string line = serverOutput.ReadToEnd();
...
私が経験している問題は、サーバーを自分で実行すると (またはリダイレクトされた出力なしでテスターで実行すると)、コンソールに 4 行すべてが表示されることです。しかし、上記のコードを使用してサーバー出力をテスター プログラムにリダイレクトすると、テスター プログラムはサーバーからの出力を待っているかのように "ReadToEnd" コマンドでハングします。
また、「ReadLine」コマンドを使用して、これを 4 回繰り返す FOR ループに入れてみました。これを行うと、出力の最初の 3 行が正常に取得され、4 番目の "ReadLine" でハングし、サーバー出力の 4 行目が取得されません。
最後に、「読み取り」コマンドを使用して文字を 1 つずつ取得しようとしましたが、サーバー出力の 4 行目から文字を取得できません。
ここで何が欠けているかについての提案はありますか?
更新:
大量の検索を行った結果、問題が出力バッファリングの問題に関連していると最終的に判断しました。サーバー プログラム (C++ で記述) は に書き込みますcout
。これは、画面に出力するときに自動的にフラッシュされるように見えますが、stdout をテスター プログラムにリダイレクトするときに自動的にフラッシュされません。サーバー プログラムに追加setvbuf(stdout, NULL, _IONBF, 0);
して stdout をバッファリングしないようにすることはできますが、サーバー プログラムの変更を伴わない別の解決策を見つけたいと思います。