IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 C Discussion :

Fork & wait(0)


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut Fork & wait(0)
    Bonjour à tous !

    Je m'exerce dans l'utilisation des forks. Récemment, j'ai conçu un petit algorithme permettant de produire N fils du processus père puis N fils pour chaque fils.

    Cependant, j'éprouve beaucoup de difficultés à comprendre le fonctionnement de « vie » des processus. En effet, il arrive que mon processus père (celui qui existait avant le premier fork) se termine avant la fin de mon programme… Mais pas toujours comme le montre mes outputs :

    Cas où ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Veuillez choisir le nombre de fils du père: 2
    Veuillez choisir le nombre de fils des fils: 2
    Je suis le pere de pid 20124, mon pere est 19928
    Je suis le fils de pid 20126, mon pere est 20125
    Je suis le fils de pid 20128, mon pere est 20125
    Je suis le fils de pid 20129, mon pere est 20127
    Je suis le pere de pid 20125, mon pere est 20124
    Je suis le fils de pid 20130, mon pere est 20127
    Je suis le pere de pid 20127, mon pere est 20124
    Cas où ça ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Veuillez choisir le nombre de fils du père: 2
    Veuillez choisir le nombre de fils des fils: 2
    Je suis le pere de pid 20160, mon pere est 19928
    Je suis le fils de pid 20162, mon pere est 20161
    Je suis le fils de pid 20164, mon pere est 20161
    Je suis le fils de pid 20165, mon pere est 20163
    Je suis le pere de pid 20161, mon pere est 20160
    bash-2.05$ Je suis le fils de pid 20166, mon pere est 20163
    Je suis le pere de pid 20163, mon pere est 1
    //Le programme ne se termine pas...
    j'ai lu beaucoup de documentations sur Internet à propos des instructions wait, waitpid, WNOHANG, WUNTRACED, etc. qui permettraient de contrôler l'extinction des processus. Malheureusement je ne les comprends pas.

    Voici mon code:
    http://rapidshare.com/files/3340422020/tpFork3.c

    Un immense merci à ceux qui accepteront de m'aider !

  2. #2
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonjour,

    Avec wait, le père peut attendre jusqu'à ce qu'un de ses fils se termine. En réitérant un tel appel n fois (nombre de fils) et en vérifiant que tu n'as pas d'erreurs, tu peux attendre la fin de tous les fils du père.

    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
    for (i = 0; i < n; i++)
      {
        int status;
     
        wait (&status);
     
        /*
         * Si on a eu une erreur qui n'est pas due à une absence de
         * fils. 
         */
        if (status == -1 && errno != ECHILD)
          {
            /* Gérer l'erreur. */
          }
      }
    En tout cas, je ne parviens pas à accéder à ton code source. Tu ferais mieux de le coller ici (entre les balises codes, bien sûr).

    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut
    Merci de ta réponse.

    Que contient ta variable status ?

    Voici mon code:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
     
    int main (int argc, char * argv[]){
     
    //Choix du nombre de fils du père;
    int nbFilsPere;
    printf ("Veuillez choisir le nombre de fils du père: ");
    scanf ("%d", &nbFilsPere);
     
    //Choix du nombre de fils du fils;
    int nbFils;
    printf ("Veuillez choisir le nombre de fils des fils: ");
    scanf ("%d", &nbFils);
     
    pid_t pere = getpid(), filsVu = 0, pereVu = 0;
    int a, compteur = 1;
     
    while (compteur <= nbFilsPere)
    {
    	//Premier fils créé;
    	int fils = 0;
    	if (getpid() == pere)
    	{	
    		a = fork();				
    		if (a == 0) fils = getpid();
    	}
     
    	//Fils du fils créé;
    	int cptFils = 1;
    	while ( fils == getpid() && cptFils <= nbFils)
    	{
    		a = fork();
    		cptFils++;
    	}
     
    	//En cas d'échec du fork;
    	if (a<0) 
    	{   
    		perror ("le fork a rate\n");
    		exit(EXIT_FAILURE);
    	}
     
    	//Affiche le pid et le ppid du fils;
    	if (a == 0 && getpid() != filsVu)
    	{
    		printf("Je suis le fils de pid %d, mon pere est %d \n", getpid(), getppid());
    		filsVu = getpid();
    	}
     
    	//Affiche le pid et le ppid du père;
    	else if (a > 0 && getpid() != pereVu)
    	{		
    		printf("Je suis le pere de pid %d, mon pere est %d \n", getpid(), getppid());
    		pereVu = getpid();	
    	}
     
    	compteur ++;
    }
     
    exit(EXIT_SUCCESS);
    }

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Pour savoir ce que contient status : http://linux.die.net/man/2/wait

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut
    Merci de ton aide,
    mais je ne comprends toujours pas ce que contient status.

    L'état de l'un des fils du processus père?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Des informations sur la terminaison du processus. Voir l'exemple à la fin de la page de man.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stoner Voir le message
    Merci de ton aide,
    mais je ne comprends toujours pas ce que contient status.

    L'état de l'un des fils du processus père?
    http://man.developpez.com/man2/wait.2.php plus simple en français peut-être ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut
    Merci à vous. Problème résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fork et wait
    Par ugo188 dans le forum Général Python
    Réponses: 24
    Dernier message: 26/01/2010, 14h18
  2. [debutant] fork et wait
    Par nyakooza dans le forum Linux
    Réponses: 4
    Dernier message: 26/08/2008, 21h27
  3. fork() wait() waitpid() et companie
    Par guillaume_60 dans le forum POSIX
    Réponses: 3
    Dernier message: 23/05/2006, 12h03
  4. fork wait
    Par lafracas dans le forum POSIX
    Réponses: 2
    Dernier message: 19/03/2005, 11h57
  5. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15

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