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

POSIX C Discussion :

Arborescence de processus


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Par défaut Arborescence de processus
    bonjour à tous,

    alors voilà cela fait plusieurs heures que j'essaye de réaliser une arborescence de processus en C avec fork(),wait() etc

    L'arborescence doit etre la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                                       P1
                                      /   \
                                    P2     P3
                                     |    /  \
                                    P4     P5   P6
    J'ai bien sur lu le manuel de fork(), des tutos divers mais plusieurs me problèmes me viennent ...

    tout d'abbord : Si je crée un processus P1, je vérifie son pid, si c'est le père je ne fais rien, si c'est le fils je recrée un processus P2
    Hors je m'attends à donc avoir 3 processus, mais la création de forks étant exponenitelle je m'en retrouve avec 4 donc 2 clones...et je ne comprends pas comment palier ce problème?

    En gros, comment organiser la création de processus père->multi-fils et comment gerer la creation exponentielle de ceux-ci?

    je rajouteque ca ne sert a rien de m'envoyer vers google c'est fait, les seuls exemples sont un pere, un fils .

    merci

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    tout d'abbord : Si je crée un processus P1, je vérifie son pid, si c'est le père je ne fais rien, si c'est le fils je recrée un processus P2
    euh? soit tu t'exprime mal, soit j'ai du mal a saisir.

    pour realiser ce que tu veux faire:
    Processus P1 cree un Fils P1-F1
    Si c'est P1, on cree un autre Fils P1-F2
    Si c'est P1-F2, on cree un Fils P1-F2-F1
    Si c'est P1-F2-F1, on s'arrete
    Si c'est P1-F2 on cree un nouveau processus Fils P1-F2-F2
    Si c'est P-F1, on cree un Fils P1-F1-F1
    on as finit pour la branche gauche


    ---
    en fait je me relis ... et je m'apperçois que c'est tetre pas tres clair
    si ça t'aide ... tant mieux ... sinon tant pis

  3. #3
    Membre émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Par défaut
    non c'est très clair, merci c'est le principe que je voulais appliquer mais en fait je voulais éviter d'embriquer des if-else .
    Donc en gros de jouer avec un for car pour cet algo, les "if" ne sont pas encore trop nombreux mais j'ai le meme genre, où l'utilisateur entre le nombre de "branches" entre 1 et 100

  4. #4
    Membre émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Par défaut
    je viens de tester mais j'ai toujours ce problème de clone :

    Je suis P1, mon numero est le : 5237, mon pere est le : 5236
    Je suis P1, mon numero est le : 5236, mon pere est le : 5160
    Je suis P2, mon numero est le : 5238, mon pere est le : 5236
    Je suis P2, mon numero est le : 5236, mon pere est le : 5160


    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
     
    #include <stdio.h>
    #include <sys/types.h>
     
    /*
    Ce programme genere l'arborescence de processus suivante :
     
       P2-P4
      /
    P1    P5
      \  /
       P3 
         \
          P6
    */
     
    int main(void)
    {
      pid_t P1 = fork();
      int P1_pid = getpid();
      int P1_parent = getppid();
      printf("Je suis P1, mon numero est le : %d, mon pere est le : %d\n",P1_pid,P1_parent);
      wait(0);
     
      if(P1 == 0)
      {
      /* Child */
      }
      else
      {
      /* Father */
        pid_t P2 = fork();
        int P2_pid = getpid();
        int P2_parent = getppid();
        printf("Je suis P2, mon numero est le : %d, mon pere est le : %d\n",P2_pid,P2_parent);
      }
     
     
    return 0;
    }
    voici juste le début de l'arboresence, j'attends 2 processus, un pere et un fils et je recois a chaque fois pere-fils, pere-fils...

    est-ce que j'ai tout mal compris?

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Putain j'ai eu cet exo au partiel de systeme...

  6. #6
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Je suis P1, mon numero est le : 5236, mon pere est le : 5160
    5160 ne serait pas le pid de ton shell bash par hasard?

    et t'as oublié
    #include <unistd.h>
    #include <sys/wait.h>

    ---edit---
    apres essais:

    ebola@gentoo ~/src $ ./fork-tuxico
    Je suis P1, mon numero est le : 14248, mon pere est le : 14247
    Je suis P1, mon numero est le : 14247, mon pere est le : 8850
    Je suis P2, mon numero est le : 14249, mon pere est le : 14247
    Je suis P2, mon numero est le : 14247, mon pere est le : 8850
    8850 pts/1 00:00:00 bash
    -
    Putain j'ai eu cet exo au partiel de systeme...
    t'as eu 20 j'espere

  7. #7
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    A mon avis, dans ton exo P1 corespond au processus cree par l'execution de ton programme, le processus principal.


    Ensuite quand tu fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pid_t P1 = fork(); //ligne 0
    int P1_pid = getpid(); //ligne 1
    int P1_parent = getppid(); //ligne 3
    printf("Je suis P1, mon numero est le : %d, mon pere est le : %d\n",P1_pid,P1_parent);//ligne 4
    Avant la ligne 0 tu n'as qu'un processus, le processus principal.
    Ensuite à la ligne 0 tu cree un nouveau processus (P1).
    Donc P1 commence à vivre aprés le fork et il va executer les lignes 1,2,3,4.
    Cependant le pere continue a vivre aussi apres le fork donc le processus principal va aussi executer les ligne 1,2,3,4.

    Ce qui fait que le proccessus principal va recuperer son pid ainsi que le pid de son pere (sans doute le pid du shell). Puis il affichera le message.
    Le processus P1 va faire la même chose. Le pid de son pere sera egal au pid du processus principal puisque qu'il est créé par lui.

    Si tu veux pas avoir ce comportement, et avoir le message que dans le fils, il faut qu'il soit dans le if(pid==0){...}.

    Voilà je sais pas si j'ai été clair, j'espère que ça t'es utile

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

Discussions similaires

  1. Killer une arborescence de processus
    Par taupinfada dans le forum AIX
    Réponses: 2
    Dernier message: 20/03/2012, 10h09
  2. l'arborescence des processus en C
    Par Akhilleus dans le forum C
    Réponses: 5
    Dernier message: 14/03/2011, 14h37
  3. Réponses: 4
    Dernier message: 18/12/2004, 14h29
  4. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48
  5. arbre de parcour d'arborescence windows
    Par chupachoc dans le forum Composants
    Réponses: 7
    Dernier message: 09/09/2002, 08h09

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