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

Linux Discussion :

création de plusieurs processus


Sujet :

Linux

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 83
    Points
    83
    Par défaut création de plusieurs processus
    Bonsoir,
    DELETE

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    en gros, vu que tu as un unique fils à chaque étape, je te conseillerais de faire ceci

    c'est pas forcemment exactement la syntaxe... juste les idées dans un premier temps

    et faut ajout les controles d'erreur...

    Code c++ : 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
    function fils(int t[2], int etage) {
    /* je ne sais pas si tu veux communiquer vers le père pour renvoyer ton résultat 
    il peut y avoir deux tuyaux... */
    /* boulot eventuel */
     
       switch (etage) { // ça se trouve un if (etage < seuil) suffirait
          case 0:  ... case N:
             int tuyau[2];
             pipe(tuyau);
             switch (fork()) {
                case 0:
                   close(tuyau[LECTURE]);
                   /* action */
                   write(tuyau[ECRITURE], resultat);
                default:
                   close(tuyau[ECRITURE]);
                   fils(tuyau, etage+1);
             }
          default: /* on stoppe de propager */
       }
    }
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre régulier Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Points : 82
    Points
    82
    Par défaut explique moi mieu e que tu veu résoudre comme problème
    ok, excuse moi de te le demander mais j'aimerais mieux comprendre le problème à résoudre car j'ai l'impression que ton blocage est plutot conceptuel
    passionné de développement

  4. #4
    Membre régulier Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Points : 82
    Points
    82
    Par défaut
    Ok, je ne connais pas les rôles de chacun de tes process pDirection, pAccueil... mais je vais essayer de te donner une réponse par rapport à la hierarchie de création et communication.
    En effet vu la hierarchie de création
    pDirection (père) -> pAdmin (fils) -> pAccueil -> pGuichet

    Pour qu'il puisse communiquer avec les autres processus par signaux, il faut absolument qu'il stocke leur pid quelque part, c'est à dire tu peux creer une table de pid_t accessible à pDirection qui stocke les pid des different process de ton appli, de telle façon qu'il puisse envoyer un signal à qui il veut quand il le veut
    par la suite tu veux que les 3 autres communiquent par tube, cela est possible, mais il faudra créer autant de tube que de communication c'est à dire, un tube pour la communication
    pAdmin (fils) - pAccueil (2 tube si tu veux la communication bidirectionnelle)

    un tube pour la communication
    pAccueil - pGuichet (2 tube si tu veux la communication bidirectionnelle)

    un tube pour la communication
    pAdmin (fils) -pGuichet (2 tube si tu veux la communication bidirectionnelle)

    Pour te faciliter la tache, il suffira de déclarer les tableaux de descripteurs de tubes dans le code de pAdmin pour qu'ils soient accessibles de tous les 3 process.

    Maintenant dis-moi, dans ton projet (conception), à quoi te servent ces differnts processus?
    passionné de développement

  5. #5
    Membre régulier Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Points : 82
    Points
    82
    Par défaut
    salut, heureux de savoir que je te suis d'une quelconque aide.
    Bon si tu veux limiter les participants à la conversation sur un tuyau donné, il te suffit de fermer les descripteurs hérités en lecture et ecriture pour ce processus par exemple, dans ton projet tu voudrais que pAdmin et pAccueil se partage un tuyau (pAdmin lecteur et pAccueil ecrivain), mais que les autres ne l'utilisent pas, alors avant que pAdmin ne crée pAccueil, mais que pGuichet ne le voit pas tu a le code

    MA BALISE CODE N'EST PAS ACTIVE

    Code c : 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
      ....
      pipe(AdminAccueil)
      accueil = fork()
      if(!accueil) /* on est dans accueil */
       { /* Tu ferme la lecture */
          close(AdminAccueil[0]);
     
          /* Maintenant aucun fils de pAccueil ne verra le descripteur en lecture 
             de AdminAccueil 
          */
          ....
          ....
     
         /* Tu crées un tube pour pAccueil et pGuichet */
         /* exemple pAccueil est ecrivain et pGuichet lecteur */
         pipe(AccueilGuichet);
         guichet = fork();
         if(!guichet) /* On est dans pGuichet */
          { /* Tu ferme le descripteur en ecriture de AccueilGuichet, mais aussi le 
                 descripteur en ecriture de AdminAccueil qu'il herite de naissance
             */
             close(AccueilGuichet[1]);
             close(AdminAccueil[1]);
             ....
             ....
          }
         else /* On est dans pAccueil */
          { /* Tu fermes le descriteur en lecture */
            close(Accueiluichet[0]);
            ...
            ...
          }
       }
      else /* On est dans pAdmin */
       { /* Tu fermes le descripteur en ecriture */
         close(AdminAccueil[1]);
         ...
         ...
       }

    Maintenant tu es prêt à avoir une communication ien répartie dans laquelle pAccueil voit les 2 tubes et chacun des 2 des autres voit uiquement son interface avec pAccueil.

    Si maintenant tu veux multiplier les tubes entre 2 process, tu le fais au même endroit que le premier crée mais tu n'oublie pas de les rendre innaccessibles de ceux qui ne sont pas concerné.

    Par contre si tu a par exemple 5 guichets dans ton appli, chacun des process représentants un guichet doit etre crée par pAccueil et avoir son tube de communication avec lui, en plus tu devras toi-même definir un protocole pour la distribution des messages sur chacun des tubes

    J'ai pour l'instant un petit prob avec mon firewall et j'ai de la peine à download sans son avis je ferai tout de même l'effort de telecharer ton pdf pour pouvoir t'apporter une meilleure aide entre temps debrouilles toi avec ces bribes et bonne chance...
    passionné de développement

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    - Quel est le comportement attendu et quel est le comportement obtenu ?

    - Il faudrait résoudre ces warnings obtenus avec -Wextra -Wall -O2 :
    wow.c:1:20: error: struct.h: No such file or directory
    wow.c: In function 'gest_sign_guichet':
    wow.c:17: warning: implicit declaration of function 'printf'
    wow.c:17: warning: incompatible implicit declaration of built-in function 'printf'
    wow.c:19: warning: implicit declaration of function 'sleep'
    wow.c: In function 'main':
    wow.c:41: warning: implicit declaration of function 'system'
    wow.c:43: warning: incompatible implicit declaration of built-in function 'printf'
    wow.c:47: warning: implicit declaration of function 'pipe'
    wow.c:52: warning: implicit declaration of function 'sprintf'
    wow.c:52: warning: incompatible implicit declaration of built-in function 'sprintf'
    wow.c:66: warning: implicit declaration of function 'getpid'
    wow.c:68: warning: implicit declaration of function 'sscanf'
    wow.c:68: warning: incompatible implicit declaration of built-in function 'sscanf'
    wow.c:75: warning: implicit declaration of function 'fork'
    wow.c:81: warning: implicit declaration of function 'execl'
    wow.c:81: warning: incompatible implicit declaration of built-in function 'execl'
    wow.c:81: error: 'NULL' undeclared (first use in this function)
    wow.c:81: error: (Each undeclared identifier is reported only once
    wow.c:81: error: for each function it appears in.)
    wow.c:81: warning: missing sentinel in function call
    wow.c:83: warning: implicit declaration of function 'exit'
    wow.c:83: warning: incompatible implicit declaration of built-in function 'exit'
    wow.c:93: warning: incompatible implicit declaration of built-in function 'execl'
    wow.c:93: warning: missing sentinel in function call
    wow.c:95: warning: incompatible implicit declaration of built-in function 'exit'
    wow.c:105: warning: incompatible implicit declaration of built-in function 'execl'
    wow.c:105: warning: missing sentinel in function call
    wow.c:116: warning: implicit declaration of function 'close'
    wow.c:37: warning: unused variable 'numVoy'
    wow.c:34: warning: unused variable 'nf'
    wow.c:34: warning: unused variable 'nb'
    wow.c:34: warning: unused variable 'j'
    wow.c:33: warning: unused parameter 'argc'
    Jc

Discussions similaires

  1. création de plusieurs processus fils
    Par batoule80 dans le forum C
    Réponses: 3
    Dernier message: 02/04/2010, 22h08
  2. Création de plusieurs niveaux de sous formulaires
    Par Farbin dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2005, 21h15
  3. création de plusieurs fiches dans un meme formulaire...
    Par Toff !!!!! dans le forum Access
    Réponses: 3
    Dernier message: 13/10/2005, 14h44
  4. création de plusieurs threads dans WinMain
    Par ChidoriRasengan dans le forum DirectX
    Réponses: 1
    Dernier message: 15/06/2005, 22h36
  5. [DEBUTANT]Lancer plusieurs processus
    Par demontools dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/04/2005, 14h48

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