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 Anonyme . Évalué à 4.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: man exec
Posté par an0y . Évalué à 0.
c'est clair que t'as raison ! ca mérite une immolation ca ! :)
# Re
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 3.
ex
#!/bin/bash
RET=true
while $RET
do
java -jar programe.jar
[ $? -eq 10 ] && RET=false
done
# Une idée comme ça...
Posté par alf . Évalué à 2.
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.