我有一個長期運行的服務器程序(比如程序A),它是用QT/C++編寫的。該程序不是很穩定,所以我決定寫一個python腳本來重新啓動它,如果它崩潰。問題是程序可能開始失敗(如果我給它一個正在使用的端口),打印錯誤,然後掛在那裏而不退出,所以我必須監視程序的stdout並在失敗的啓動時殺死它。Windows控制檯程序標準輸出使用管道重定向時被緩衝
這是一段我的最終代碼(好吧,其實這是好的,你可以忽略它):
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的方法只是阻止那裏,如果我殺了一個進程,python腳本只是退出沒有任何輸出。在一開始,我認爲這是一個子進程模塊的問題,但經過一些測試後,我發現它不是。如果我用一些其他的Windows控制檯程序替換A.exe命令行,例如ping -t,一切工作正常。所以我認爲這可能是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++編譯器爲使用QT(GCC 4.4.0)的ming32 g ++,所有測試均在win7x64平臺上完成,並且我的Python版本是2.7.2
我認爲[相關鏈接](http://stackoverflow.com/q/20503671/4279)在您的鏈接評論解釋得很多,謝謝 – adamhj 2014-09-09 02:03:43