Le programme de console Windows stdout est mis en mémoire tampon lors de l’utilisation de la redirection de canal

J’ai un programme de serveur à long terme (par exemple, le programme A) qui est écrit en QT / c ++. le programme n’est pas si stable, alors je décide d’écrire un script python pour le redémarrer s’il se bloque. le problème est que le programme peut échouer (si je lui ai donné un port en cours d’utilisation), imprimer l’erreur et ensuite restr là sans quitter, donc je dois surveiller la sortie du programme et le tuer en cas d’échec du démarrage.

Ceci est un morceau de mon code final (bon, en fait ça va, vous pouvez simplement l’ignorer):

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='') 

mais j’ai trouvé que je ne pouvais rien lire du stdout de subprocess, la méthode readline ne fait que bloquer, et si je tue le processus A, le script python se ferme sans aucune sortie. Au début, je pensais que c’était un problème de module de sous-processus, mais après quelques tests, je l’ai trouvé non. Si je remplace la ligne de commande A.exe par un autre programme de la console Windows, par exemple ping -t, tout fonctionne correctement. alors j’ai pensé que cela pouvait être le problème du programme A.

Heureusement, j’ai le code source de A, voici un morceau traitant de la sortie:

 printf("Server is starting on port %u\n", Config.ServerPort); if(server->listen()) printf("Starting successfully\n"); else printf("Starting failed!\n"); 

après quelques recherches, j’ajoute fflush(stdout); à la fin de ce morceau de code, reconstruisez le programme, et maintenant ça marche

donc mon problème est que je ne peux toujours pas comprendre, ce qui ne va pas avec le code de programme original A? sans vidage forcé, il peut imprimer correctement ces chaînes dans une console Windows, immédiatement après le démarrage du programme. Pourquoi la sortie est-elle mise en mémoire tampon lors de l’utilisation de pipe sur sa sortie? J’ai lu que dans c implémentation standard, la sortie sera purgée automatiquement sur la nouvelle ligne, mais pourquoi pas dans ma situation? Est-ce un problème de Windows ou un problème de compilateur?

le programme A est compilé avec QT / C ++, la version QT est 4.7.4 (x32), le compilateur C ++ est le ming32 g ++ fourni avec QT (GCC 4.4.0), tous les tests ont été effectués sur la plate-forme win7x64 et ma version python est 2.7.2