Processus arriere/avant plan non zombie! - c/linux

davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008 - 31 déc. 2004 à 14:08
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005 - 3 janv. 2005 à 20:36
Bonjour a tt monde,
je ne comprends pas trop ça :
"Les processus lancés en arrière-plan et terminés ne doivent pas rester zombie mais leur terminaison doit être prise en compte par le shell (ou le programme principal - main)."

Qlqn d'entre vous peut m'expliquer ça, et surtout un simple exemple (avec un contre exemple si possible) pour mieux comprendre.

PS : en c/c++ sous linux.

merci bq d'avance.

12 réponses

plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
31 déc. 2004 à 14:50
"Les processus lancés en arrière-plan et terminés ne doivent pas rester zombie mais leur terminaison doit être prise en compte par le shell (ou le programme principal - main)."*

c'est incompréhensible effectivement. Qui a pondu ça ?
Je pense que cette personne a voulu dire que le processus pere doit attendre la terminaison de son fils, s'il ne l'attend plus, le processus fils devient zombie.
davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008
31 déc. 2004 à 15:04
merci,
non je ne pense pas ça, il parle sur : "Les processus lancés en arrière-plan et terminés", comme sous linux quand on lance emacs par exemple avec "emacs &", puis apres moments si on le ferme il nous affiche un ti message ([id] + done). bah si je ne me trompe pas !!?!, mais je ne sais pas comment faire ça aussi :(
svp aidez moi!
merci bq.
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
31 déc. 2004 à 15:24
comment faire quoi ?
Dans ton exemple, emacs& peut jouer le role du fils et le shell, du pere.
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
31 déc. 2004 à 15:45
Ca ressemble à un mauvais cours de système ça...

Les processus lancés en arrière-plan (avec le &) ne sont rien d'autre que des fork() donc des processus fils. Je suis d'accord avec ++fab : en clair quand il y a un shell et qu'on lance des applis en arriere-plan, ce sont des processus fils et donc il faut faire attention à ne pas faire de zombie.

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008
1 janv. 2005 à 14:45
lol, c'est pas un cours, mais un exo :p
"donc il faut faire attention à ne pas faire de zombie" et comment faire ça?

pour emacs par exemple : quand on lance avec & (en arriere plan), apres quand on le ferme il nous affiche .[pid] +Done!
comment programmer ça?! avec signal?!

autre question : comment faire passer un processus de forground à background et inversement!

merci pour tt info

a++
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
1 janv. 2005 à 16:03
"donc il faut faire attention à ne pas faire de zombie" et comment faire ça?
attendre le fils avec wait ou waitpid.

"comment programmer ça?! avec signal?!"
#include <signal.h>
#include <stdio.h>
#include <errno.h>

void term(int sig)
{
printf("signal %d reçu\n",sig);
exit(0);
}

int main()
{
if (signal(SIGTERM,term) == SIG_ERR) {
perror("erreur signal");
exit(-1);
}
// fait qq chose ...
}

"autre question : comment faire passer un processus de forground à background et inversement!"
avec le shell, commandes fg et bg.
davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008
1 janv. 2005 à 16:14
merci
pour fg et bg j'aime le faire en c, car je suis en train de programmer un shell ;)
merci
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
1 janv. 2005 à 18:03
Le zombie est un process qui a perdu sont pere et ne sait pas comment s'attacher a init. Comme le dit ++fab il suffit en theorie que le pere fasse un wait() ou waitpid() helas ce n'est pas si simple il faut aussi que le pere soit immunise contre les signaux en installant un handler pour ceux-ci. Le core dump helas ne peut pas etre intercepte. Il faut donc que le pere soit bug free!. Pour le kill -9 du pere, le fils sera tue aussi ce n'est peut etre pas ce que l'on veut obtenir.

Pour la seconde part de la question fg/bg ce n'est pas si simple. Je comprend qu'il est question de changer le comportement du process en cours d'execution de le passer en fg ou en bg par un moyen externe ( un signal envoye du shell pour passer de bg en fg et une combinaison de touche pour passer de fg en bg).
Le bg consiste a deconnecter le process de stdin ( on conserve cependant stderr et stdout) a deconnecter le controlling tty et eventuellement a l'attacher au process init . On peut prevoir une routine dans le process qui sera activee par l'appui de touches et deconnectera stdin.
le Fg est un peut plus complique mais on peut lancer a partir du shell un signal qui reconnectera le process a stdin (kill USR1 my_process_id).
Vaste sujet ......
Yves


Yves
davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008
2 janv. 2005 à 14:25
Merci Yves,
je demande svp de me donner un code qui fera les taches de bg/fg, car vraiment je me galère depuis moments :(, je dois le faire mais j'arrive pas :(, j'ai essayer avec kill et les signal, ça marche pas, je me suis bloquer dans tt les sens!!
svp aidez moi!
a+
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
2 janv. 2005 à 17:26
OK je vais t'aider mais laisse moi le temps de remonter linux sur mon portable.

Ai je bien compris ton probleme de bg/fg? dois tu vraiement commuter le meme process de bg en fg et inversement pendant son execution?

en attendant montre moi un peu le code que tu as ecris pour cela.
Tu peux me l'envoyer off-line si tu veux.

Yves
davidauche Messages postés 150 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 8 janvier 2008
3 janv. 2005 à 11:13
Merci Yves,
pour le code j'aimerais avoir une fonction ou procédure reçois le pid de process, et cette fonction permet le mettre
en Background et inversement, le processus est creer tt simplement avec fork. Tu peux utiliser system ou execvp
pour lancer emacs pour faire les tests.

Merci beaucoup d'avance, vraiment tu vas me sauver la vie!
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
3 janv. 2005 à 20:36
Tu ne reponds pas a mes questions.

As tu essaye de mettre un process en bg avec un fork()?

Si oui envoie moi le code.

Si non essaie de le faire et envoie moi ton code.


Yves
Rejoignez-nous