我有一个长期运行的服务器程序(比如程序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