8
votes

Processus.exitvalue () et processus.destroy ()

J'ai expérimenté avec processus code> et processbuilder CODE> et vient avec ce SSCCE.

 java.lang.IllegalThreadStateException: process has not exited
 Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
        at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
        at TestProcess.main(TestProcess.java:30)


3 commentaires

1) } catch (IoException ignorée) {} Tirez vos erreurs du sable et plutôt } catch (ioException E) {E.PrintStackTrace (); } 2) Assurez-vous que le code implémente les recommandations de "lorsque Runtime.Exec () ne" 3) "3) doit être précis, un CSCCE nécessite des importations.


@Andrewthompson, 1) Je suis sûr qu'il peut toujours exécuter le Bloc-notes à Windows, 2) ce que vous voulez dire? 3) Oui, une seule importation.


@Andrewthompson, merci, j'ai mis à jour le code pour 1) et 3).


3 Réponses :


1
votes

Je m'attends à ce que la méthode Destroy () appelle la fonction de fonctionnement Windows native Terminez-la. En regardant MSDN , J'ai trouvé ceci:

TerminerProcess est asynchrone; Il initie la résiliation et les retours immédiatement. Si vous devez vous assurer que le processus a terminé, appelez la fonction WaitforsingleObject avec une poignée au processus.

Donc, je pense que cela explique que la destruction est effectivement asynchrone.

Un autre extrait de la même source:

La fonction TerminerProcess est utilisée pour entraîner de manière inconditionnelle un processus de sortie.

Je suppose que "inconditionnellement" peut expliquer pourquoi l'appel de détruire () sur un processus de résiliation n'échoue pas.

J'espère que cette aide. (Question vraiment intéressante!)


0 commentaires

1
votes
  1. Pourquoi serait cela montre un problème? Vous essayez de détruire un processus déjà détruit. La spécification de processus.destroy () ne dis pas ce qui se passe s'il n'y avait rien à détruire, il est donc logique (je suppose) de supposer que s'il n'y a rien à détruire, il n'y a rien à se plaindre À propos. Comparez avec thread.join () , qui ne meure pas seulement si le fil est déjà terminé.

  2. Le seul moyen de tuer un processus est de l'envoyer un signal. Sur certains OS, il existe d'autres moyens plus "violents" (sur certaines plates-formes, par exemple, il est possible de supprimer simplement le processus de la liste des processus d'exécution du système d'exploitation. Les résultats ne sont pas définis et il finit généralement laid), mais au moins Avec des plates-formes que je connais, c'est vraiment tout sur l'envoi de signaux.

  3. possible, en effet, que c'est parce qu'il faut du temps pour invoquer thread.sleep () . Essayez d'augmenter la valeur du délai d'expiration.


6 commentaires

Merci de répondre. 3. Je diminue progressivement la valeur des millisecondes à seulement 1 nanosecondes. Dans tous les cas si Sleep () est appelé deuxième ExitValue () Retour 1 et ne jette pas d'exception.


Je vois. En ce qui concerne (3), alors, je n'ai aucune explication. J'ai regardé le code de processimpl sous Windows; ExitValue () Appelle une fonction native que je croire finit par appeler Windows ' getExitCodeProcess . Rien dans la documentation de l'une ou l'autre des méthodes ne mentionne quoi que ce soit sur un code de sortie arbitraire 1 pour un processus qui n'a pas vraiment pris fin. Bizarre en effet.


Je crois que c'est fini si 1 est renvoyé, sinon elle jette une exception. Je suppose que dormir prend beaucoup plus de temps, suffisamment pour que le processus soit terminé.


Pour conclure que, vous auriez besoin de vérifier si 1 est un code de sortie "formel" documenté pour Notepad .


Si je le ferme manuellement avant d'être d'abord dormir les deux EXITEVALUE Impresses 0


Oui. Lorsque vous fermez notopad.exe gracieusement, son code de sortie doit être (et IS) 0 . La question est - y a-t-il une documentation concernant les circonstances dans lesquelles NotePad.exe retournera un code de sortie 1 ? Et si oui, quelles sont ces circonstances?



1
votes

processimpl.java sur détruire méthode fonction de la fonction native TerminerProcess : xxx

TerminerProcess est dépendant de la plate-forme et pour Windows, vous pouvez trouver des sources ici . Il s'agit simplement d'appel Windows Terminer la fonction de traitement (lien vers cette fonction était dans la réponse précédemment ou que vous pouvez google it) avec uexitcode = 1 - c'est pourquoi le code de sortie du processus détruit est 1 .

à Linux semble être utilisé quelque chose de similaire à Ceci . Et comme preuve du code suivant renvoyer 143 in ubuntu, qui correspond à sigterm ( https : //stackoverflow.com/a/4192488/3181901 ): xxx


0 commentaires