Forum Clubic

Fermeture d'un Process - envoyer message par son entrée standard?

Bonjour bonjour,

Il y a quelques temps, j’avais un problème pour lancer un programme en Java avec Runtime.exec(String), mais maintenant, c’est resolu (toujours vider le buffer de sortie du programme ainsi lancé).

Maintenant, je voudrais pouvoir fermer le programme que j’ai lancé. Pour cela, je sais qu’il existe la méthode Process.destroy()[/url], cette dernière marche dans le cas général ou il n’y a qu’un seul processus de lancé (genre calc.exe, notepad.exe, …) mais imaginons que le programme que j’ai lancé ait lui-même lancé un processus (son fils), eh bien lorsque j’appelle [url=http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Process.html#destroy()]Process.destroy(), seul le processus que j’ai lancé se termine, son/ses fils continuant à tourner.

Je me suis donc dit que la solution était de fermer “proprement” le tout, et pour cela, je pense qu’il faut demander (via l’entrée standard, qu’on obtient via Process.getOutputStream()) au processus père (celui que j’ai lancé) de se fermer, partant du principe qu’il fermera bien le ou les processus qu’il a lui même lancé.

Mon problème est que je n’arrive pas à demander a mon programme de se fermer, je connais le [Control] + [C] en ligne de commande, mais :

  • je ne suis pas sûr que ca fonctionne avec tous les programmes (console ET graphique)
  • je ne sais pas comment “l’émuler” pour le mettre dans le OutputStreamMerci de votre aide.

EDIT: Corrections de fautes d’orthographe/grammaire/…
Edité le 31/05/2007 à 00:41

as tu un handle sur le processus fils appelé? A mon avis ca ne marchera pas car tu ne dois pas avoir le sources du processus pere

Le seul handle que j’ai c’est sur le processus père.
Je recherche un “signal” “universel” pour fermer une application.

Sur la page suivante : ASCII Character Code Reference, j’ai lu que “0x03” (End Of Text, ETX) correspondait au [Ctrl]+[C], j’ai donc essayé ce qui suit :

OutputStream pOut = process.getOutputStream();
byte[] data = {(byte)0x03};
pOut.write(data);
pOut.flush();

Lorsque je veux fermer le processus lancé, mais ca ne le ferme pas :frowning:

Si il n’y a pas de message universel, je peux aussi essayer de voir du côté des signaux POSIX : SIGINT[/url], [url=http://en.wikipedia.org/wiki/SIGTERM]SIGTERM, … Mais je n’ai pas trouvé de truc en Java pour ça.

Essaye de trouver quelque chose pour aller voir les PID de ton system et de killer la tache comme ca :confused:

http://bugs.sun.com/bugdatabase/view_bug.d…?bug_id=4770092

La question est posée là… tu peux peut être trouver une solution

tu peux essayer de voir l’api jps sinon

tableur > jps c’est pas pour imprimer ?

popolof > J’ai a peu près tout lu et apparement, y pas mal de methodes/fonctionnalités que beaucoup de developpeurs voudraient, mais qui n’existent toujours pas : destroyWithChildren(), termination handler, getPid(), …

Il va donc peut-etre falloir que je me tourne vers une solution faisant appel a du C++ et des appels du genre "kill …" après avoir recupéré le PID du processus père.

nan JPS c’est pour java process RUn time system je crois, en général c’est API te permet de gérer tous les thread lancer sur la JVM. Je sais bien que dans ton thread n’appartient pas à la JVM mais il y a peu etre des methodes qui te permetterons d’y avoir acces.
A voir …

ou y’a system.shutdown() mais c’est un peu brutal…

Ninon on ne peut pas surcharger le process.destroy()?? et lancer un kill à chacun de ses fils?

Le problème c’est que les programmes que je lance ne sont pas Java (ce ne sont donc pas des Process).

tableur > Le JPS c’est pas bon non plus :frowning: