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 :

l'arborescence des processus en C


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut l'arborescence des processus en C
    SVP, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
    const int n=3;
    int i;
    for(i=0;i<n&&fork();i++)
    printf("Inst.for : i=%d du processus %d fils de %d \n",i,getpid(),getppid());
    printf("Fin du processus %d de pere %d avec i= %d \n",getpid(),getppid(),i);
    return 0;
    }
    je veux savoir pour chacun des processus de cette arborescenece, quel sera la valeur de i ?? et merci pour l'aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Il n'est pas question que l'on fasse ton travail à ta place, d'autant qu'en l'occurrence, il suffit de compiler ton programme pour avoir la réponse.

    Si tu bloques sur un point précis, dis-nous ce que tu as réalisé jusqu'ici, les valeurs que selon toi on devrait trouver, et ce qui te gène en particulier.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Par défaut
    Bonsoir,
    Compile ton code et tu auras ta reponse

  4. #4
    Membre actif
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    oui, merci pour le conseil , que j'ai djà fait avant de poster le message
    mais ce que j'ai obtenu et le suivant :

    Fin du processus 3627 de pere 3626 avec i= 0
    Inst.for : i=0 du processus 3626 fils de 3606
    Fin du processus 3628 de pere 3626 avec i= 1
    Inst.for : i=1 du processus 3626 fils de 3606
    Fin du processus 3629 de pere 3626 avec i= 2
    Inst.for : i=2 du processus 3626 fils de 3606
    Fin du processus 3626 de pere 3606 avec i= 3

    Ce que j'ai pas compris, pourquoi on ignore le 1er printf("inst.for ....") au début et à la fin.
    Supposé que dans le programme.
    c'est cette instruction qui doit s'afficher au premier, non ? qlq chose comme :

    Inst.for : i=0 du processus 3626 fils de 3606
    Fin du processus 3627 de pere 3626 avec i= 0
    Inst.for : i=1 du processus 3626 fils de 3606
    Fin du processus 3628 de pere 3626 avec i= 1
    Inst.for : i=2 du processus 3626 fils de 3606
    Fin du processus 3629 de pere 3626 avec i= 2
    Inst.for : i=3 du processus 3626 fils de 3606
    Fin du processus 3626 de pere 3606 avec i= 3

    mais c'est pas le cas, si j'aurai une petite explication ça serait vraiment généreux de votre part.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Lorsque tu fais fork(), tu te retrouves avec deux processus qui s'exécutent « en même temps ». Les termes « en même temps » sont une vue de l'esprit lorsque tu travailles sur un processeur unique, mais il en reste que rien ne te garantit l'ordre dans lequel ils vont être exécutés. C'est à la totale discrétion du système.

    En outre, on peut considérer que le père a déjà consommé une partie de son quantum de temps, contrairement au fils nouveau-né, ce qui donne un avantage à ce dernier. Enfin, ce même père fait un appel système, donc lui rend la main un instant, et ce pour lui demander expressément de créer un processus fils. Il n'y a donc pas de raison pour que le système, après avoir créé un fils, rende la main à nouveau au processus père pour lui laisser finir son quantum, alors qu'il y a d'autres processus qui attendent leur tour à côté.

    Autre point important, il y a de fortes chances aujourd'hui pour que tu travailles sur une machine multi-core. Et, dans ce cas, tes deux processus sont réellement exécutés en même temps.

    À ce stade, on peut donc dire que non seulement l'ordre d'affichage sera aléatoire, mais le fils sera très favorisé. Mais en plus, printf() n'est pas un appel système mais une fonction de la bibliothèque C standard. Ce qui fait que tout ce que tu écris est bufferisé par défaut dans l'espace du processus avant d'être balancé vers la sortie sur événement particulier. Le retour à la ligne en fait partie, certes. MAIS, le contenu du buffer est automatiquement vidé quand le processus prend fin. Et il est de fait que ton fils meurt forcément avant son père ! Donc son contenu sera purgé en urgence.

    Enfin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<n&&fork();i++)
    Outre le fait qu'il soit dangereux d'inclure fork() dans la condition de boucle parce que tu ne gères pas le cas ou l'appel échoue (en retournant -1), tu introduis une étape supplémentaire. Après la création du fils, tu es encore dans le test de condition de boucle. Il faut alors que le processus vérifie que la valeur retournée par l'appel système soit différent de zéro pour décider d'entrer dans le corps de la boucle et y trouver ton print().


    Il est évident que le père en ressort nettement défavorisé.

  6. #6
    Membre actif
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Merci pour l'aide.

    ça a commencé à se clarifier un peu

Discussions similaires

  1. [C#] Configuration du niveau de priorite des processus
    Par stephdiplo150 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 22/04/2007, 23h29
  2. Un peu de lumière sur l'arborescence des fichiers de Linux
    Par Noki dans le forum Administration système
    Réponses: 6
    Dernier message: 07/04/2004, 16h16
  3. [Arborescence des répertoires]
    Par JustAGphy dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 25/03/2004, 14h47
  4. [langage] fonctionnement des Processus
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 11h12
  5. Réponses: 2
    Dernier message: 04/10/2002, 09h13

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