Forum Programmation.c contrôle d'un process Java par un process C

Posté par  .
Étiquettes : aucune
0
9
mar.
2006
salut à tous !

je travail sur un projet qui fait tourner des processus C et un process java.

Aujourd'hui quand le process java plante, les autres processus ne peuvent pas reperer son plantage parcequ' il n' a pas de process pere.

Ce que j'aimerais c'est pouvoir lancer le processus java à partir d'un process C et avoir un code retour vers le processus qui le lance en cas de plantage... Et pouvoir redemarrer le processus java éventuellement automatiquement par le process C

quelqu'un connait une solution à mon pb ?

++

an0y
  • # Commentaire supprimé

    Posté par  . Évalué à 4.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: man exec

      Posté par  . Évalué à 0.

      mouhahaha, la réponse qui tue ! hihi ;)

      c'est clair que t'as raison ! ca mérite une immolation ca ! :)
  • # Re

    Posté par  (site web personnel) . Évalué à 3.

    un simple script shell fera tout aussi bien le travail
    ex

    #!/bin/bash
    RET=true

    while $RET
    do
    java -jar programe.jar
    [ $? -eq 10 ] && RET=false
    done
  • # Une idée comme ça...

    Posté par  . Évalué à 2.

    Quand tu dis que ton processus Java plante, c'est qu'il plante lamentablement avec une exception, ou que tu as fait un System.exit() ?

    Le mieux, c'est de gérer dans ton programme Java la sortie de manière propre: suivant ce qui se passe, tu sors avec un System.exit(code), ou code prend une valeur non nulle en cas d'erreur, ou 0 si tout va bien. Au passage, la doc de l'API Java indique juste que "By convention, a nonzero status code indicates abnormal termination", la traduction entre le code que tu donnes à exit() et ce que le système reçoit n'est pas spécifiée (à ce que j'ai trouvé dans l'API et la Java language specification, mais je peux me tromper).

    Par là-dessus, tu peux faire, soit un script shell si c'est autorisé (portabilité, contraintes, tout ça), comme Benoit Plessis te l'a indiqué plus haut, soit un programme C tout simple qui fait la même chose avec system() (ou fork() puis un exec* si tu y tiens) pour lancer le processus. Pour recevoir la fin du processus, tu peux utilider un gestionnaire de signaux avec signal(), ou faire directement un wait(). Le gestionnaire de signaux a l'avantage de permettre à ton processus C de faire autre chose pendant ce temps, le wait() bloquant le processus jusqu'à l'arrivée d'un signal. Cependant, avec un gestionnaire de signaux, le "traitement principal" fait par ton processus C peut être interrompu à tout moment. donc la conception et le codage doivent être adaptés (réentrance, principalement, ou le cas des processus multi-threadés).
    system() et signal() sont du C ISO, mais wait(), fork(), les exec*() et SIGCHLD, qui codifie le signal "mort d'un processus fils" pour signal() sont POSIX (le C ISO ne définissant pas les notions de processus père/fils, ou même de parallélisme, de threads ou quoi que ce soit dans le genre).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.