Accueil de l'archive Service proposé par Hervé AGNOUX

TOUT -|- TOUT sur le visuel -|- TOUT sur la logistique

From:           	"Zeljko Velaja" <zvelaja@club-internet.fr>
To:             	<java@u-strasbg.fr>
Subject:        	System.exit(0)
Date sent:      	Mon, 22 Jan 2001 22:47:06 +0100
Send reply to:  	java@u-strasbg.fr

Je viens de m'apercevoir avec surprise qu'une classe java pouvait invoquer
n'importe quelle méthode publique d'une autre classe, y compris la méthode
main() !

Est-il en revanche possible d'empêcher une classe bien précise d'effectuer
un System.exit() ? Je voudrais lancer une appli à partir d'une autre, et
lorsque l'application lancée appelle System.exit(), je voudrais que seul
son processus à elle disparaisse, non le processus parent.

     

Date sent:      	Tue, 23 Jan 2001 01:25:49 +0100
From:           	"Eric LEMAITRE" <eric.lemaitre@csinstitut.fr>
Organization:   	CS-Institut ( http://www.csinstitut.fr )
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Salut !

zeljko velaja a écrit :

> Oui, mais il ne s'agit pas pour l'appli mère de tuer sa fille, mais
> d'empêcher la fille de tuer sa mère ...
>
>      > Est-il en revanche possible d'empêcher une classe bien
>      précise d'effectuer un System.exit() ? Je voudrais lancer
>      une appli à partir > d'une autre, et lorsque l'application
>      lancée appelle System.exit(), je voudrais que seul son
>      processus à elle disparaisse, non le > processus parent.
>      Pour faire ça proprement comme tu le décris il me semble que
>      ça s'appelle un Thread, à ce moment là tu ne fais pas de
>      "System.exit()" mais tu tues le Thread, ce qui termine bien
>      le processus concerné de toutes façons.
>
Effectivement, tu avais une bonne raison de poser cette question, excuse
ma boutade, c'était de l'humour :-) . Par contre, je crains que les autres
aient répondu en clair : System.exit() n'est pas interceptable de fait.
Bonne chance, mais je crains que ça ne soit pas faisable, à moins peut
être d'avoir un genre de middleware qui contrôle régulièrement les
références données par chaque constructeur d'application, peut être que sa
référence vaut "null" quand l'application correspondante est morte... Je
sais pas si je t'aide là, mais c'est un problème vraiment pointu.

@ ++ !

--
    ^
   ° °    Eric LEMAITRE
  / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS)
 //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
Certified)
/ (   ) \ Responsable de formation pour les filières Internet et Linux
(Head of Internet/Linux Education Department)
   ^~^


     

Date sent:      	Tue, 23 Jan 2001 01:32:24 +0100
From:           	"Eric LEMAITRE" <eric.lemaitre@csinstitut.fr>
Organization:   	CS-Institut ( http://www.csinstitut.fr )
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Salut !

Jean François Peltier a écrit :
> Je crains qu'il ne soit pas possible de bloquer le system.exit(0),
puisque, sauf erreur, les 2 applis mere et fille partagent la meme >
machine virtuelle et que celle ci est detruite par la commande.
Tout à fait d'accord, tu as raison, ça me semble infaisable.

> Maintenant, la seule solution est de modifier la classe fille pour
enlever ce system.exit(0).> J'ai bien peur que ce soit la seule
solution. Du moins a ma connaissance.
Sauf que la méthode "exit()" est une methode statique de la classe
"System", donc on ne peut pas l'enlever, même pas la surcharger dans la
classe fille puisque ce serait la méthode d'instance "exit()" de la classe
fille et pas la méthode "exit()" de la classe "System", donc ça change
rien, on tourne en rond. Donc toujours pas de solution à mon sens.

@ ++ !
 --
    ^
   ° °    Eric LEMAITRE
  / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS)
 //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
Certified)
/ (   ) \ Responsable de formation pour les filières Internet et Linux
(Head of Internet/Linux Education Department)
   ^~^


     

Date sent:      	Tue, 23 Jan 2001 01:45:57 +0100
From:           	"Eric LEMAITRE" <eric.lemaitre@csinstitut.fr>
Organization:   	CS-Institut ( http://www.csinstitut.fr )
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Salut !

Herve AGNOUX a écrit :

> > Est-il en revanche possible d'empêcher une classe bien précise
> > d'effectuer un System.exit() ? Je voudrais lancer une appli à partir
> > d'une autre, et lorsque l'application lancée appelle System.exit(), je
> > voudrais que seul son processus à elle disparaisse, non le processus
> > parent.
> >
>
> Tout dépend si c'est toi qui écrit le code ou non.
>
> Si tu l'écris pas, la seule solution est de passer par le
> SecurityManager, comme d'autres l'on dit. Ce n'est vraiment pas génial,
> mais bon.
>
> Si c'est toi qui écrit le code, la situation s'améliore !
>
> Pour ma part, sur les classes que je veux équiper de cette fonction, je
> travaille avec des classes et interfaces statiques internes. J'imagine
> que je pourrais généraliser cette combine, mais je l'ai pas encore fait.

Non, je ne pense pas que ça soit ça : tu as raison Hervé, il y a la
"mauvaise" solution du SecurityManager d'un côté, mais rien de l'autre
côté car ce qu'il veut depuis le début c'est en fait intercepter la
méthode "System.exit()" elle même. L'unique solution est bien de passer
par le SecurityManager, c'est ça qui répond vraiment à son besoin, je
pense. Par contre si quelqu'un peut nous proposer du code (sous 2 formes
si possible, simple fichier "policy" et du code plus sophistiqué, si
possible), ça serait le pied.

@ ++ !

--
    ^
   ° °    Eric LEMAITRE
  / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS)
 //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
 Certified)
/ (   ) \ Responsable de formation pour les filières Internet et Linux
(Head of Internet/Linux Education Department)
   ^~^


     

From:           	ROUSSEL Yohann <yohann.roussel@criltelecom.com>
To:             	"'java@u-strasbg.fr'" <java@u-strasbg.fr>
Subject:        	RE: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 10:45:04 +0100
Send reply to:  	java@u-strasbg.fr

la premiere piste que je voyais etait basee sur
java.lang.Runtime.addShutdownHook mais la doc semble dire qu'une fois le
processus entame y'a plus moyen de revenir en arriere Par contre il te
reste un moyen de faire quelque chose avec le SecurityManager et la
methode checkExit bonne chance


> -----Message d'origine-----
> De:	Zeljko Velaja [SMTP:zvelaja@club-internet.fr]
> Date:	lundi 22 janvier 2001 22:47
> À:	java@u-strasbg.fr
> Objet:	System.exit(0)
> 
> Je viens de m'apercevoir avec surprise qu'une classe java pouvait
> invoquer n'importe quelle méthode publique d'une autre classe, y compris
> la méthode main() !
>  
> Est-il en revanche possible d'empêcher une classe bien précise
> d'effectuer un System.exit() ? Je voudrais lancer une appli à partir
> d'une autre, et lorsque l'application lancée appelle System.exit(), je
> voudrais que seul son processus à elle disparaisse, non le processus
> parent.

     

Date sent:      	Tue, 23 Jan 2001 12:03:23 +0100
From:           	"Eric LEMAITRE" <eric.lemaitre@csinstitut.fr>
Organization:   	CS-Institut ( http://www.csinstitut.fr )
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Salut la liste !

Zeljko Velaja a écrit :

> Je viens de m'apercevoir avec surprise qu'une classe java pouvait
invoquer n'importe quelle méthode publique d'une autre classe, y >
compris la méthode main() !
Argh ! Je croyais qu'une classe publique pouvait justement par
définition être appelée de n'importe laquelle autre classe, donc
j'ignorais que ça pouvait être une surprise ! On m'aurait menti :-)) ?

> Est-il en revanche possible d'empêcher une classe bien précise
d'effectuer un System.exit() ? Je voudrais lancer une appli à partir >
d'une autre, et lorsque l'application lancée appelle System.exit(), je
voudrais que seul son processus à elle disparaisse, non le > processus
parent. Pour faire ça proprement comme tu le décris il me semble que ça
s'appelle un Thread, à ce moment là tu ne fais pas de "System.exit()" mais
tu tues le Thread, ce qui termine bien le processus concerné de toutes
façons.

Au passage, une question : la méthode "stop()" étant dépréciée pour les
Threads, qu'est ce que vous utilisez pour tuer un Thread ? Moi j'utilise
toujours "stop()" même s'il est déprécié parce que je ne sais pas quoi
utiliser d'autre.

@ ++ !

--
    ^
   ° °    Eric LEMAITRE
  / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS)
 //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
Certified)
/ (   ) \ Responsable de formation pour les filières Internet et Linux
(Head of Internet/Linux Education Department)
   ^~^


     

From:           	"Melody" <marilou.sarl@wanadoo.fr>
To:             	<java@u-strasbg.fr>
Subject:        	Re: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 12:17:32 +0100
Send reply to:  	java@u-strasbg.fr


----- Original Message -----
From: Eric LEMAITRE

Salut,

>Au passage, une question : la méthode "stop()" étant dépréciée pour les
Threads, qu'est ce que vous utilisez pour tuer un Thread ? Moi j'utilise
>toujours "stop()" même s'il est déprécié parce que je ne sais pas quoi
utiliser d'autre.

Le pb du stop c'est qu'il permet trop facilement de se retrouver en
dead-lock....
Normalement ton thread doit se terminer par la fin de sa méthode run. tu
dois donc passer par un flag interrogé dans les cycles d'attentes de ton
thread et qui, si il est positionné, entraine la fin de ta méthode run...

Enfin, c'est ce que j'ai compris ..;o)

A+
Marc

     

Date sent:      	Tue, 23 Jan 2001 04:12:50 -0800 (PST)
From:           	Thierry Janaudy <janaudy@yahoo.com>
Subject:        	Re: System.exit(0)
To:             	java@u-strasbg.fr
Send reply to:  	java@u-strasbg.fr


--- Eric LEMAITRE <eric.lemaitre@csinstitut.fr> wrote:
> Au passage, une question : la méthode "stop()" étant
> dépréciée pour les
> Threads, qu'est ce que vous utilisez pour tuer un
> Thread ? Moi j'utilise
> toujours "stop()" même s'il est déprécié parce que
> je ne sais pas quoi
> utiliser d'autre.
> 

http://java.sun.com/j2se/1.3/docs/guide/misc/threadPrimitiveDeprecation.html

-- Thierry

=====
______________________________________
Thierry Janaudy
Independent consultant
+44 77 52 14 3001 || janaudy@yahoo.com
http://www.mycgiserver.com/~janaudy/
______________________________________

__________________________________________________
Do You Yahoo!?
Yahoo! Auctions - Buy the things you want at great prices. 
http://auctions.yahoo.com/

     

Date sent:      	Tue, 23 Jan 2001 13:16:24 +0100
From:           	"Alain Aïtoulha" <Alain.Aitoulha@ln.cit.alcatel.fr>
Organization:   	Alcatel
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Eric LEMAITRE wrote:

> Salut la liste !
>
> Zeljko Velaja a écrit :
>
> > Je viens de m'apercevoir avec surprise qu'une classe java pouvait
> invoquer n'importe quelle méthode publique d'une autre classe, y >
> compris la méthode main() !
> Argh ! Je croyais qu'une classe publique pouvait justement par
> définition être appelée de n'importe laquelle autre classe, donc
> j'ignorais que ça pouvait être une surprise ! On m'aurait menti :-)) ?
>
> > Est-il en revanche possible d'empêcher une classe bien précise
> d'effectuer un System.exit() ? Je voudrais lancer une appli à partir >
> d'une autre, et lorsque l'application lancée appelle System.exit(), je
> voudrais que seul son processus à elle disparaisse, non le > processus
> parent. Pour faire ça proprement comme tu le décris il me semble que ça
> s'appelle un Thread, à ce moment là tu ne fais pas de "System.exit()"
> mais tu tues le Thread, ce qui termine bien le processus concerné de
> toutes façons.
>
> Au passage, une question : la méthode "stop()" étant dépréciée pour les
> Threads, qu'est ce que vous utilisez pour tuer un Thread ? Moi j'utilise
> toujours "stop()" même s'il est déprécié parce que je ne sais pas quoi
> utiliser d'autre.

J'utilise destroy()
A+
Alain


>
>
> @ ++ !
>
> --
>     ^
>    ° °    Eric LEMAITRE
>   / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS)
>  //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
> Certified)
> / (   ) \ Responsable de formation pour les filières Internet et Linux
> (Head of Internet/Linux Education Department)
>    ^~^
>

     

From:           	"Valerie Berthie" <vberthie@soleri.com>
To:             	<java@u-strasbg.fr>
Subject:        	Re: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 13:18:04 +0100
Send reply to:  	java@u-strasbg.fr

pour remplacer la methode stop de Thread, c'est bien explique dans la doc
du jdk a cet endroit :

jdk1.3\docs\guide\misc\threadPrimitiveDeprecation.html

Valerie Berthie

----- Message d'origine -----
De : Melody <marilou.sarl@wanadoo.fr>
À : <java@u-strasbg.fr>
Envoyé : mardi 23 janvier 2001 12:17
Objet : Re: System.exit(0)


>
> ----- Original Message -----
> From: Eric LEMAITRE
>
> Salut,
>
> >Au passage, une question : la méthode "stop()" étant dépréciée pour les
> Threads, qu'est ce que vous utilisez pour tuer un Thread ? Moi j'utilise
> >toujours "stop()" même s'il est déprécié parce que je ne sais pas quoi
> utiliser d'autre.
>
> Le pb du stop c'est qu'il permet trop facilement de se retrouver en
> dead-lock.... Normalement ton thread doit se terminer par la fin de sa
> méthode run. tu dois donc passer par un flag interrogé dans les cycles
> d'attentes de ton thread et qui, si il est positionné, entraine la fin
> de ta méthode run...
>
> Enfin, c'est ce que j'ai compris ..;o)
>
> A+
> Marc

     

From:           	"Herve AGNOUX" <hagnoux@mail.club-internet.fr>
To:             	java@u-strasbg.fr
Date sent:      	Tue, 23 Jan 2001 14:11:36 +0100
Subject:        	Re: System.exit(0)
Priority:       	normal
Send reply to:  	java@u-strasbg.fr

Le 22 Jan 01, Zeljko Velaja a écrit :

> 
> Est-il en revanche possible d'empêcher une classe bien précise
> d'effectuer un System.exit() ? Je voudrais lancer une appli à partir
> d'une autre, et lorsque l'application lancée appelle System.exit(), je
> voudrais que seul son processus à elle disparaisse, non le processus
> parent.
> 

Tout dépend si c'est toi qui écrit le code ou non.

Si tu l'écris pas, la seule solution est de passer par le 
SecurityManager, comme d'autres l'on dit. Ce n'est vraiment pas 
génial, mais bon.

Si c'est toi qui écrit le code, la situation s'améliore !

Pour ma part, sur les classes que je veux équiper de cette 
fonction, je travaille avec des classes et interfaces statiques 
internes. J'imagine que je pourrais généraliser cette combine, mais 
je l'ai pas encore fait.

Voici un exemple :

public class MaClasse
{
    public static interface Finalisable
    {
 public void fini();

 public static class Defaut implements Finalisable
 {
     public void fini(){System.exit(0);}
 }
    }

    private Finalisable pourFinir = new Finalisable.Defaut();

 ...

Et ensuite, dans mon objet, au lieu de faire un exit, je fais 
"pourFinir.fini()".

L'extérieur peut modifier le paramètre "pourFinir", de type 
"Finalisable", selon les accesseurs que la classe veut bien mettre 
à disposition.

"Finalisable" est une interface, composée d'une seule méthode, 
que je concrétise en donnant le comportement le plus habituel 
(pour l'occasion, System.exit(0)).

L'extérieur est libre de concrétiser cette interface comme il le veut.

Ainsi je peux controler objet par objet ce qui se passe sur un exit.


--
Hervé AGNOUX  hagnoux@mail.club-internet.fr
Faites vos sites avec des formulaires electroniques :
http://www.diaam.com

     

From:           	Jean François Peltier <jfa1096@yahoo.fr>
To:             	<java@u-strasbg.fr>
Subject:        	Re: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 14:12:07 +0100
Send reply to:  	java@u-strasbg.fr


    Je crains qu'il ne soit pas possible de bloquer le system.exit(0),
    puisque, sauf erreur, les 2 applis mere et fille partagent la meme
    machine virtuelle et que celle ci est detruite par la commande.

    Maintenant, la seule solution est de modifier la classe fille pour
    enlever ce system.exit(0).

    J'ai bien peur que ce soit la seule solution. Du moins a ma
    connaissance.

        Jeff

  ----- Original Message ----- 
  From: zeljko velaja 
  To: 'java@u-strasbg.fr' 
  Sent: Tuesday, January 23, 2001 2:53 PM
  Subject: RE: System.exit(0)


  Oui, mais il ne s'agit pas pour l'appli mère de tuer sa fille, mais
  d'empêcher la fille de tuer sa mère ...
    -----Message d'origine-----
    De : Eric LEMAITRE [mailto:eric.lemaitre@csinstitut.fr]
    Envoyé : mardi 23 janvier 2001 11:03
    À : java@u-strasbg.fr
    Objet : Re: System.exit(0)


    > Est-il en revanche possible d'empêcher une classe bien précise
    d'effectuer un System.exit() ? Je voudrais lancer une appli à partir >
    d'une autre, et lorsque l'application lancée appelle System.exit(), je
    voudrais que seul son processus à elle disparaisse, non le > processus
    parent. Pour faire ça proprement comme tu le décris il me semble que
    ça s'appelle un Thread, à ce moment là tu ne fais pas de
    "System.exit()" mais tu tues le Thread, ce qui termine bien le
    processus concerné de toutes façons. 


     

Date sent:      	Tue, 23 Jan 2001 05:20:34 -0800 (PST)
From:           	Thierry Janaudy <janaudy@yahoo.com>
Subject:        	Re: System.exit(0)
To:             	java@u-strasbg.fr
Send reply to:  	java@u-strasbg.fr

Une solution elegante:

tu installes un security manager en fait tu cree
un security namanager en derivant la classe
java.lang.securityManager et tu implementes
checkExit(int s):

public void ckeckExit(int status) {
  super(status)
  throw new SecurityException();
}

puis dans ton code tu try/catch l'appel a la classe,
methode, ou ...

Voila.

D'ailleurs cela peut se faire avec java.policy

Thierry


--- Jean_François_Peltier <jfa1096@yahoo.fr> wrote:
> 
>     Je crains qu'il ne soit pas possible de bloquer
> le system.exit(0), puisque, sauf erreur, les 2
> applis mere et fille partagent la meme machine
> virtuelle et que celle ci est detruite par la
> commande.
>     
>     Maintenant, la seule solution est de modifier la
> classe fille pour enlever ce system.exit(0).
> 
>     J'ai bien peur que ce soit la seule solution. Du
> moins a ma connaissance.
> 
>         Jeff
> 
>   ----- Original Message ----- 
>   From: zeljko velaja 
>   To: 'java@u-strasbg.fr' 
>   Sent: Tuesday, January 23, 2001 2:53 PM
>   Subject: RE: System.exit(0)
> 
> 
>   Oui, mais il ne s'agit pas pour l'appli mère de
> tuer sa fille, mais d'empêcher la fille de tuer sa
> mère ...
>     -----Message d'origine-----
>     De : Eric LEMAITRE
> [mailto:eric.lemaitre@csinstitut.fr]
>     Envoyé : mardi 23 janvier 2001 11:03
>     À : java@u-strasbg.fr
>     Objet : Re: System.exit(0)
> 
> 
>     > Est-il en revanche possible d'empêcher une
> classe bien précise d'effectuer un System.exit() ?
> Je voudrais lancer une appli à partir > d'une autre,
> et lorsque l'application lancée appelle
> System.exit(), je voudrais que seul son processus à
> elle disparaisse, non le > processus parent. 
>     Pour faire ça proprement comme tu le décris il
> me semble que ça s'appelle un Thread, à ce moment là
> tu ne fais pas de "System.exit()" mais tu tues le
> Thread, ce qui termine bien le processus concerné de
> toutes façons. 
> 
> 


=====
______________________________________
Thierry Janaudy
Independent consultant
+44 77 52 14 3001 || janaudy@yahoo.com
http://www.mycgiserver.com/~janaudy/
______________________________________

__________________________________________________
Do You Yahoo!?
Yahoo! Auctions - Buy the things you want at great prices. 
http://auctions.yahoo.com/

     

From:           	zeljko velaja <zvelaja@visualfriendly.com>
To:             	"'java@u-strasbg.fr'" <java@u-strasbg.fr>
Subject:        	RE: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 13:53:41 -0000
Send reply to:  	java@u-strasbg.fr

Oui, mais il ne s'agit pas pour l'appli mère de tuer sa fille, mais
d'empêcher la fille de tuer sa mère ...

-----Message d'origine-----
De : Eric LEMAITRE [mailto:eric.lemaitre@csinstitut.fr]
Envoyé : mardi 23 janvier 2001 11:03
À : java@u-strasbg.fr
Objet : Re: System.exit(0)



> Est-il en revanche possible d'empêcher une classe bien précise
> d'effectuer
un System.exit() ? Je voudrais lancer une appli à partir > d'une autre, et
lorsque l'application lancée appelle System.exit(), je voudrais que seul
son processus à elle disparaisse, non le > processus parent. Pour faire ça
proprement comme tu le décris il me semble que ça s'appelle un Thread, à
ce moment là tu ne fais pas de "System.exit()" mais tu tues le Thread, ce
qui termine bien le processus concerné de toutes façons. 


     

From:           	Jean François Peltier <jfa1096@yahoo.fr>
To:             	<java@u-strasbg.fr>
Subject:        	Re: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 15:09:16 +0100
Send reply to:  	java@u-strasbg.fr


    En fait je suis bete puisque la solution etait dans ma réponse ! Le
    system.exit(0) "tue" la machine virtuelle dans laquelle ca tourne.
    Pour empecher la fille de tuer la mere, il suffit donc d'avoir deux
    machines virtuelles : une pour la mere, une pour la fille.

    Et pour faire ca, il faut utiliser Runtime.getRuntime().exec("java
    ..");

    J'ai fait un essai rapide avec le code ci dessous. la classe myFrame
    est une frame avec un bouton exit (system.exit(0)). je tape java Mere
    au prompt et la frame s'affiche. Le while true est uniquement la pour
    prouver que la mere est encore vivante lorsqu'on clique sur l'exit de
    la fille...


    Comme quoi, la prochaine fois, je tournerais 7 fois ma souris avant de
    répondre... ;)

    Jeff

class Mere
{
 public static void main (String argv [])
 {
    try
    {
      Process p  = Runtime.getRuntime().exec("java myFrame");

      while (true)
   {
   }
  }
  catch(Exception e)
  {
   System.err.println("Exception " + e);
  }
 }
}

  ----- Original Message ----- 
  From: Eric LEMAITRE 
  To: java@u-strasbg.fr 
  Sent: Tuesday, January 23, 2001 1:32 AM
  Subject: Re: System.exit(0)


  Salut ! 
  Jean François Peltier a écrit :  
  > Je crains qu'il ne soit pas possible de bloquer le system.exit(0),
  puisque, sauf erreur, les 2 applis mere et fille partagent la meme >
  machine virtuelle et que celle ci est detruite par la commande. Tout à
  fait d'accord, tu as raison, ça me semble infaisable. 

  > Maintenant, la seule solution est de modifier la classe fille pour
  enlever ce system.exit(0).> J'ai bien peur que ce soit la seule
  solution. Du moins a ma connaissance. Sauf que la méthode "exit()" est
  une methode statique de la classe "System", donc on ne peut pas
  l'enlever, même pas la surcharger dans la classe fille puisque ce serait
  la méthode d'instance "exit()" de la classe fille et pas la méthode
  "exit()" de la classe "System", donc ça change rien, on tourne en rond.
  Donc toujours pas de solution à mon sens. 

  @ ++ ! 
   -- 
      ^ 
     ° °    Eric LEMAITRE 
    / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS) 
   //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
   Certified) 
  / (   ) \ Responsable de formation pour les filières Internet et Linux
  (Head of Internet/Linux Education Department) 
     ^~^ 



     

From:           	"Nicolas Delsaux" <nicolas.delsaux@free.fr>
To:             	<java@u-strasbg.fr>
Subject:        	Re: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 15:54:44 +0100
Organization:   	Miriad Technologies
Send reply to:  	java@u-strasbg.fr

Tu n'as pas peur d'exploser ta mémoire ? Avec deux machines virtuelles, c
'est possible...Surtout si tu itères ton processus pour te retrouver avec
n machines virtuelles...

Nicolas Delsaux
  ----- Original Message ----- 
  From: Jean François Peltier 
  To: java@u-strasbg.fr 
  Sent: Tuesday, January 23, 2001 3:09 PM
  Subject: Re: System.exit(0)



      En fait je suis bete puisque la solution etait dans ma réponse ! Le
      system.exit(0) "tue" la machine virtuelle dans laquelle ca tourne.
      Pour empecher la fille de tuer la mere, il suffit donc d'avoir deux
      machines virtuelles : une pour la mere, une pour la fille.

      Et pour faire ca, il faut utiliser Runtime.getRuntime().exec("java
      ..");

      J'ai fait un essai rapide avec le code ci dessous. la classe myFrame
      est une frame avec un bouton exit (system.exit(0)). je tape java
      Mere au prompt et la frame s'affiche. Le while true est uniquement
      la pour prouver que la mere est encore vivante lorsqu'on clique sur
      l'exit de la fille...


      Comme quoi, la prochaine fois, je tournerais 7 fois ma souris avant
      de répondre... ;)

      Jeff

  class Mere
  {
   public static void main (String argv [])
   {
      try
      {
        Process p  = Runtime.getRuntime().exec("java myFrame");

        while (true)
     {
     }
    }
    catch(Exception e)
    {
     System.err.println("Exception " + e);
    }
   }
  }

    ----- Original Message ----- 
    From: Eric LEMAITRE 
    To: java@u-strasbg.fr 
    Sent: Tuesday, January 23, 2001 1:32 AM
    Subject: Re: System.exit(0)


    Salut ! 
    Jean François Peltier a écrit :  
    > Je crains qu'il ne soit pas possible de bloquer le system.exit(0),
    puisque, sauf erreur, les 2 applis mere et fille partagent la meme >
    machine virtuelle et que celle ci est detruite par la commande. Tout à
    fait d'accord, tu as raison, ça me semble infaisable. 

    > Maintenant, la seule solution est de modifier la classe fille pour
    enlever ce system.exit(0).> J'ai bien peur que ce soit la seule
    solution. Du moins a ma connaissance. Sauf que la méthode "exit()" est
    une methode statique de la classe "System", donc on ne peut pas
    l'enlever, même pas la surcharger dans la classe fille puisque ce
    serait la méthode d'instance "exit()" de la classe fille et pas la
    méthode "exit()" de la classe "System", donc ça change rien, on tourne
    en rond. Donc toujours pas de solution à mon sens. 

    @ ++ ! 
     -- 
        ^ 
       ° °    Eric LEMAITRE 
      / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS) 
     //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
     Certified) 
    / (   ) \ Responsable de formation pour les filières Internet et Linux
    (Head of Internet/Linux Education Department) 
       ^~^ 



     

Date sent:      	Tue, 23 Jan 2001 16:50:27 +0100
From:           	Guillaume Desnoix <guillaume.desnoix@cetmef.equipement.gouv.fr>
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr


Il n'y pas de solution simple. Il faut patcher la JVM, en fait la classe
System.java. C'est ce que fait Echidna ou JShell (voir canal java). Les
paliatifs ont ete exposes dans les messages precedents mais aucun n'est
ideal. Il faut soit la cooperation de la classe fille, soit la mise en
place d'un SecurityManager en esperant que la fille a deja libere ses
ressources (c'est rarement le cas mais c'est de la responsabilite du
developpeur de l'appli fille). A combiner avec un classloader adapte et
une bonne gestion de thread. Des solutions ont ete proposees pour les
futurs JDKs (1.4 ou 1.5). Suffit d'attendre ;-)

     

Date sent:      	Tue, 23 Jan 2001 16:52:55 +0100
From:           	Philippe Delrieu <pdelrieu@cybernomade.com>
Organization:   	Cybernomade.com
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Peut être en utilisant une class loader specifique pour la fille qui parse
le byte code et remplace les appels System.exit() par des appels mieux
maitrisés et que ne libèrent que les classes et thread de la fille. C'est
un peu tordu mais cela peut marché. Si il y a des personnes qui
connaissent bien la struture des classes java, cela doit être possible de
valider rapidement la faisabilité.

Philippe Delrieu

zeljko velaja wrote:

> Mais non, tu n'es pas bête ... Mais la question se pose toujours : mon
> but est justement de ne PAS avoir deux machines virtuelles, mais une
> seule ! J'ai l'idée naïve que lancer un processus à partir d'une machine
> virtuelle existante est plus rapide que lancer un processus externe. Par
> ailleurs, le processus externe a priori ne me permet pas de le contrôler
> à partir du processus parent, tandis que le processus interne le permet.
> Donc pas de Runtime().getRuntime().java(...) :-)
> 
>  
> 
> Je suis bien entenu aussi en attente d'un bout de code, même
> minimaliste.
> 
>     -----Message d'origine-----
>     De : Jean François Peltier [mailto:jfa1096@yahoo.fr]
>     Envoyé : mardi 23 janvier 2001 14:09
>     À : java@u-strasbg.fr
>     Objet : Re: System.exit(0)
>     
>      
>     
>         En fait je suis bete puisque la solution etait dans ma réponse 
>     ! Le system.exit(0) "tue" la machine virtuelle dans laquelle ca 
>     tourne. Pour empecher la fille de tuer la mere, il suffit donc
>     d'avoir deux machines virtuelles : une pour la mere, une pour la
>     fille.
>     


     

From:           	zeljko velaja <zvelaja@visualfriendly.com>
To:             	"'java@u-strasbg.fr'" <java@u-strasbg.fr>
Subject:        	RE: System.exit(0)
Date sent:      	Tue, 23 Jan 2001 16:03:24 -0000
Send reply to:  	java@u-strasbg.fr

Mais non, tu n'es pas bête ... Mais la question se pose toujours : mon but
est justement de ne PAS avoir deux machines virtuelles, mais une seule !
J'ai l'idée naïve que lancer un processus à partir d'une machine virtuelle
existante est plus rapide que lancer un processus externe. Par ailleurs,
le processus externe a priori ne me permet pas de le contrôler à partir du
processus parent, tandis que le processus interne le permet. Donc pas de
Runtime().getRuntime().java(...) :-)

Je suis bien entenu aussi en attente d'un bout de code, même minimaliste.

-----Message d'origine-----
De : Jean François Peltier [mailto:jfa1096@yahoo.fr]
Envoyé : mardi 23 janvier 2001 14:09
À : java@u-strasbg.fr
Objet : Re: System.exit(0)



    En fait je suis bete puisque la solution etait dans ma réponse ! Le
system.exit(0) "tue" la machine virtuelle dans laquelle ca tourne. Pour
empecher la fille de tuer la mere, il suffit donc d'avoir deux machines
virtuelles : une pour la mere, une pour la fille.


     

Date sent:      	Tue, 23 Jan 2001 18:56:43 +0100
From:           	Guillaume Desnoix <guillaume.desnoix@cetmef.equipement.gouv.fr>
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr


Philippe Delrieu:
>Peut être en utilisant une class loader specifique pour la fille qui
>parse le byte code et remplace les appels >System.exit() par des appels
>mieux maitrisés et que ne libèrent que les classes et thread de la fille.
>C'est un peu tordu mais cela peut marché. Si il y a des personnes qui
>connaissent bien la struture des classes >java, cela doit être possible
>de valider rapidement la faisabilité.

Effectivement mais je pense que ca ne resoud pas completement le
probleme. On peut facilement remplacer au chargement d'une classe 'e x i
t' par 'b e e p'. Beep n'existant pas, on aura une NoSuchMethodException.
On peut aussi mettre en place son propre code qui ne genere pas
d'exception. Reste la delicate question de savoir quelle appli a demande a
se terminer...

Car des qu'il y a un evenement dans l'IHM, on se retrouve dans le thread
de Swing, qui est partage. D'autre part, il faudrait aussi liberer les
ressources qui ne l'ont pas ete, principalement graphiques. De la a
reecrire son toolkit... pour marquer les Window utilisees. Je ne parle
meme pas des autres ressources (fichiers et sockets principalement) mais
on peut esperer qu'elles ne sont pas referencees ailleurs.

Ce ne sont que des idees a valider mais a mon avis, ce n'est franchement
pas simple. Et tous les projets qui ont voulu resoudre ce probleme ont du
modifier les classes de base, voir le code source de la JVM.

Par contre si l'appli fille a ete bien ecrite (cad si elle appelle
System.exit() uniquement lorsqu'elle a libere l'ensemble de ses
ressources), alors le probleme est nettement simplifie et le
SecurityManager doit suffire.

Guillaume

     

Date sent:      	Tue, 23 Jan 2001 10:18:37 -0800 (PST)
From:           	Thierry Janaudy <janaudy@yahoo.com>
Subject:        	Re: System.exit(0)
To:             	java@u-strasbg.fr
Send reply to:  	java@u-strasbg.fr

Bon la c'est le code avec SecurityManager:
(Prochain email pour le policy)

public class SM {
  public static void main(String[]_) {
    System.setSecurityManager(new MySM());

    System.err.println("Before...");
    try {
      ThirdPartyClass tpc = new ThirdPartyClass();
    } catch (SecurityException se) {
    }
    System.err.println("After...");
  }
}

class ThirdPartyClass {
  public ThirdPartyClass() {
    System.exit(0);
  }
}

class MySM extends SecurityManager {
  public void checkExit(int status) {
    super.checkExit(status);
    throw new SecurityException();
  }
}

-- Thierry

--- Eric LEMAITRE <eric.lemaitre@csinstitut.fr> wrote:
> L'unique solution est bien de passer par le
> SecurityManager, c'est ça qui répond
> vraiment à son besoin, je pense. Par contre si
> quelqu'un peut nous proposer du
> code (sous 2 formes si possible, simple fichier
> "policy" et du code plus
> sophistiqué, si possible), ça serait le pied.


=====
______________________________________
Thierry Janaudy
Independent consultant
+44 77 52 14 3001 || janaudy@yahoo.com
http://www.mycgiserver.com/~janaudy/
______________________________________

__________________________________________________
Do You Yahoo!?
Yahoo! Auctions - Buy the things you want at great prices. 
http://auctions.yahoo.com/

     

Date sent:      	Tue, 23 Jan 2001 10:24:46 -0800 (PST)
From:           	Thierry Janaudy <janaudy@yahoo.com>
Subject:        	Re: System.exit(0)
To:             	java@u-strasbg.fr
Send reply to:  	java@u-strasbg.fr

Pour le policy file (Avec le policytool du jdk)

En fait, je vais pas le faire, car c'est trop
"chiant".

A ma connaissance avec le policytool tu ne peux
qu'autoriser et pas interdire, ce qui reviendrait
a tout autoriser sauf exitVM... bon, de toute
facon ca marche en theorie.

Plus simple et mons de peine avec le code.
Referez vous a la page ci-dessous si vous voulez
le faire:
http://java.sun.com/j2se/1.3/docs/tooldocs/win32/policytool.html

-- Thierry

--- Eric LEMAITRE <eric.lemaitre@csinstitut.fr> wrote:
> L'unique solution est bien de passer par le
> SecurityManager, c'est ça qui répond
> vraiment à son besoin, je pense. Par contre si
> quelqu'un peut nous proposer du
> code (sous 2 formes si possible, simple fichier
> "policy" et du code plus
> sophistiqué, si possible), ça serait le pied.


=====
______________________________________
Thierry Janaudy
Independent consultant
+44 77 52 14 3001 || janaudy@yahoo.com
http://www.mycgiserver.com/~janaudy/
______________________________________

__________________________________________________
Do You Yahoo!?
Yahoo! Auctions - Buy the things you want at great prices. 
http://auctions.yahoo.com/

     

Date sent:      	Tue, 23 Jan 2001 20:00:30 +0100
From:           	"Eric LEMAITRE" <eric.lemaitre@csinstitut.fr>
Organization:   	CS-Institut ( http://www.csinstitut.fr )
To:             	java@u-strasbg.fr
Subject:        	Re: System.exit(0)
Send reply to:  	java@u-strasbg.fr

Salut !

Thierry Janaudy a écrit :

> Bon la c'est le code avec SecurityManager:
> (Prochain email pour le policy)
>
> public class SM {
>   public static void main(String[]_) {
>     System.setSecurityManager(new MySM());
>
>     System.err.println("Before...");
>     try {
>       ThirdPartyClass tpc = new ThirdPartyClass();
>     } catch (SecurityException se) {
>     }
>     System.err.println("After...");
>   }
> }
>
> class ThirdPartyClass {
>   public ThirdPartyClass() {
>     System.exit(0);
>   }
> }
>
> class MySM extends SecurityManager {
>   public void checkExit(int status) {
>     super.checkExit(status);
>     throw new SecurityException();
>   }
> }
>

OK, merci Thierry !

@ ++ !

--
    ^
   ° °    Eric LEMAITRE
  / V \   Ingénieur CNAM (CNAM Computer Engineer, MSCS)
 //   \\  Ingénieur et Formateur certifié Linux Red-Hat (RHCE & RHCX
Certified)
/ (   ) \ Responsable de formation pour les filières Internet et Linux
(Head of Internet/Linux Education Department)
   ^~^



C'est fini ! Retour à l'accueil de la pseudo-archive