Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Utilisation de waitpid


Sujet :

POSIX C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Utilisation de waitpid
    Bonjour à tous,

    J'ai une petite question sur un exemple de terminaison d'un processus.

    j'ai ce code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    pid_t fils;
     
    void handler(int sig)
    {
        waitpid(fils, NULL, 0);
    }
     
    int main()
    {
        sigaction(SIGCHLD, handler);
        fils = fork();
    }
     
    ...
    ...


    Ma question est la suivante :

    Dans ce code le processus père n'attendra pas la fin du fils si lui-même ce termine avant non ?


    pour y remedier comment pourrais-je faire ?
    en remplaçant par :
    waitpid(fils, &action, 0) ??


    Merci de vos réponses

    Bon week end a tous

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    juin 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2009
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par bentsen Voir le message

    Dans ce code le processus père n'attendra pas la fin du fils si lui-même ce termine avant non ?


    pour y remedier comment pourrais-je faire ?
    en remplaçant par :
    waitpid(fils, &action, 0) ??
    bonjour,
    ton processus pere s'excutera sans attendre le fils.
    je vais te donner un petit exemple qui te permettra de comprendre coorectement comment marche le fork().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
     
    void			aff_err(char *str)
    {
    	my_putstr("error: ");
    	my_putstr(str);
    	my_putchar('\n');
    	exit(1);
    }
     
    int     		main()
    {
    	pid_t		pid;
     
    	if ((pid = fork()) < 0)
    	aff_err("fork");
    	if (pid)
    	{
    		int	status;
     
    		my_putstr("Pere : j'attends mon fils...\n");
    		wait(&status);
    		my_putstr("Pere : a bientot\n");
    	}
    	else
    	{
    		sleep(3);
    		my_putstr("Fils : me voila\n");
    	}
    }
    ce qui donne

    $ ./a.out
    Pere : j'attends mon fils...
    Fils : me voila
    Pere : a bientot
    il est bien important de comprendre comment creer un processus fils a partir du pere si tu as l'intention de t'attaquer aux signaux comme ton programme le montre
    tu pourras executer le code et voir ce que ca donne tu pourras meme augementer le sleep pour voir que le pere attend bien le fils
    voila en esperant t'avoir aider

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 515
    Points : 2 503
    Points
    2 503
    Par défaut
    Si tu veux que ton père attende son fils, il faut simplement faire le waitpid() à l'endroit où tu veux attendre, et pas dans le handler de SIGCHLD.

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    juin 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2009
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par matafan Voir le message
    Si tu veux que ton père attende son fils, il faut simplement faire le waitpid() à l'endroit où tu veux attendre, et pas dans le handler de SIGCHLD.
    voila justement, matfan a tout dis. En gros ta fonction handler ne sert a rien.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    septembre 2007
    Messages
    7 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 193
    Points : 22 952
    Points
    22 952
    Par défaut
    Citation Envoyé par matafan Voir le message
    Si tu veux que ton père attende son fils, il faut simplement faire le waitpid() à l'endroit où tu veux attendre, et pas dans le handler de SIGCHLD.
    Citation Envoyé par SeRiALP Voir le message
    voila justement, matfan a tout dis. En gros ta fonction handler ne sert a rien.
    Sauf qu'à mon avis, ce n'est pas l'objet de sa question. Il ne faut pas oublier que, lorsque le père survit à son fils, un wait() est nécessaire pour éviter que le dernier ne reste zombie.

    Citation Envoyé par bentsen
    Ma question est la suivante :

    Dans ce code le processus père n'attendra pas la fin du fils si lui-même ce termine avant non ? pour y remedier comment pourrais-je faire ?
    en remplaçant par : waitpid(fils, &action, 0) ??
    Non, « &action », ici ne correspond à rien de valable.

    • Si le père meurt avant ses fils, alors soit toute sa descendance reçoit un signal et disparaît en même temps, soit elle est émancipée, et est rattachée soit à init, soit à un autre processus.
    • Si tu veux être propre et attendre que le fils ait fini ce qu'il a à faire, mets simplement un wait() à la fin de ton programme.
    • Si tu as peur que ton programme ne se termine prématurément, utilises atexit(), mais ça risque de devenir chiant à débugger en cas de problème.
    • Si tu veux créer un dæmon, soit un programme qui vit sa vie tout seul en tâche de fond et dont le père, pour ce faire, doit rendre la main au Shell qui l'a engendré, tu peux chercher les mots-clés idoines : How to daemonize.

Discussions similaires

  1. utiliser les PID sous Windows XP (waitpid,etc)
    Par busard dans le forum Général Python
    Réponses: 4
    Dernier message: 25/10/2007, 12h28
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo