私は、QT/c++ で書かれた長期間実行されるサーバー プログラム (プログラム A など) を持っています。プログラムはあまり安定していないので、クラッシュした場合に再起動するための Python スクリプトを作成することにしました。問題は、プログラムが起動に失敗し (使用中のポートを指定した場合)、エラーを出力し、終了せずにハングアップする可能性があることです。そのため、プログラムの stdout を監視し、起動に失敗したときに強制終了する必要があります。
これは私の最終的なコードの一部です (まあ、実際にはこれで問題ありません。無視してかまいません):
self.subp = subprocess.Popen(
r'.\A.exe -server %d' % portnum,
stdout=subprocess.PIPE, bufsize=1)
for line in iter(self.subp.stdout.readline, ''):
print(line, end='')
しかし、サブプロセスの stdout から何も読み取れないことがわかりました。readline メソッドはそこでブロックされているだけです。A プロセスを強制終了すると、Python スクリプトは何も出力せずに終了します。最初はサブプロセスモジュールの問題だと思っていましたが、テストの結果、そうではないことがわかりました。A.exe コマンド ラインを他の Windows コンソール プログラム (ping -t など) に置き換えると、すべて正常に動作します。だから私はそれがAプログラムの問題かもしれないと思った.
幸いなことに、私は A のソース コードを持っています。ここに出力を扱う部分があります。
printf("Server is starting on port %u\n", Config.ServerPort);
if(server->listen())
printf("Starting successfully\n");
else
printf("Starting failed!\n");
いくつかの検索の後fflush(stdout);
、このコードの最後に追加し、プログラムを再構築すると、動作するようになりました
だから私の問題は、私がまだ理解できないということです.元のAプログラムコードの何が問題になっていますか? 強制的にフラッシュしなくても、プログラムの開始直後に、これらの文字列を Windows コンソールに正しく出力できます。出力でパイプを使用すると出力がバッファリングされるのはなぜですか? 標準のC実装では、改行時に出力が自動的にフラッシュされることを読みましたが、私の状況ではそうではないのはなぜですか? これは Windows の問題ですか、それともコンパイラの問題ですか?
A プログラムは QT/C++ でコンパイルされ、QT バージョンは 4.7.4(x32)、C++ コンパイラは ming32 g++ で、QT(GCC 4.4.0) に付属しています。すべてのテストは win7x64 プラットフォームで実行され、私の python バージョンは2.7.2