2010-10-19 7 views
2

Je lance un processus de fenêtres (écrit en C++, mais je ne veux pas avoir des sources) à partir du code Java de la manière suivante:Pourquoi Process.waitFor() ne retourne-t-il jamais?

Process p1 = Runtime.getRuntime().exec(cmdAndParams); 
p1.waitFor(); 

Mon problème est que la méthode waitFor() ne se termine jamais. J'ai donc essayé de lancer le processus dans un shell simple et il se termine correctement avec beaucoup d'impression dans le shell (sortie standard je suppose).

J'ai donc décidé de créer et démarrer un thread en lisant la sortie standard même si je n'ai pas besoin pour l'instant de ces sorties. Cela a corrigé le problème. Donc ma question est la suivante: Cette solution est-elle la "norme Java pour lancer et attendre des processus externes ayant des sorties" ou cela signifie-t-il qu'il y a un problème quelque part dans le processus natif? Si un tel problème existe quelle programmation C++ "error" peut être à l'origine du problème?

Répondre

16

Ceci est une chose du système d'exploitation. Le processus fils écrit sur stdout, et cela est mis en mémoire tampon en attendant que votre processus Java le lise. Lorsque vous ne le lisez pas, le tampon finit par se remplir et le processus enfant bloque l'écriture sur stdout en attendant l'espace tampon.

Vous devez traiter le processus fils 'stdout (et stderr) quel que soit le langage que vous utilisiez.

Je vous suggère de lire this article (toutes les 4 pages) et de mettre en œuvre les recommandations.

+0

Merci. La réponse était dans le Javadoc mais au niveau de la classe et je n'ai lu que les méthodes exec et waitFor doc. La prochaine fois je lirai aussi le doc de classe ;-) –

Questions connexes