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 :

création de plusieurs processus fils


Sujet :

C

  1. #1
    Membre du Club Avatar de batoule80
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 53
    Points
    53
    Par défaut création de plusieurs processus fils
    bonjour,

    il s'agit de créer 3 processus fils :
    f1 : retourne la valeur 5
    f2 : retourne la valeur 10
    f3 : retourne la valeur 3

    le processus père attend le retour de ses trois fils pour réaliser le calcul
    3*10+5

    voici mon programme :

    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
     
    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include <sys/wait.h> 
     
    int main()
    {
     
    int f1,f2,f3;
     
    printf ("je suis le père :%d\n", getpid());
     
    f1 = fork();
     
    switch ( f1 ) {
    		case  -1 : 
                              printf ("erreur dans la création du processus");
                              break;
     
                    case   0 : 
                              printf ("je suis le fils1 , mon pid est: %d \n", getpid());
                              return(5);
    		          break;
     
                    default  :f2 = fork();
                                          switch ( f2 )  {
    		                      case  -1 : 
                                                    printf ("erreur dans la création du processus");
                                                    break;
     
                                          case   0 : 
                                                    printf ("je suis le fils2 , mon pid est: %d \n", getpid());
                                                    return(10);
    		                                break;
     
                                          default  :f3 = fork();                
                                                                switch ( f3 )  {
    		                                            case  -1 : 
                                                                printf ("erreur dans la création du processus");
                                                                break;
     
                                                                case   0 : 
                                                                printf ("je suis le fils3 , mon pid est: %d \n", getpid());
                                                                return(3);
    		                                            break;
     
                                                                default  : 
                                                                          printf ("c'est toujours le père en fin de traitement\n");
                                                                           waitpid(f1, NULL, 0);
                                                                           waitpid(f2, NULL, 0);
                                                                           waitpid(f3, NULL, 0);                                                     
                                                                                     } 
     
                                                             }
     
                   }
     
     
    }
    et voilà ce qui est affiché aprés l'éxécution :

    je suis le père :4394
    je suis le fils1 , mon pid est: 4395
    je suis le fils2 , mon pid est: 4396
    c'est toujours le père en fin de traitement
    je suis le fils3 , mon pid est: 4397

    l'avant dernière ligne , le père s'éxécute avant son 3 ième fils !!!!!!!!! je m'en sors pas trés bien avec les imbrications des switch
    waitpid ne s'éxécute pas !!!
    comment récupérer les valeurs 5 , 10 , 3 ?

    une idée merci de partager
    cordialemnt

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par batoule80 Voir le message
    l'avant dernière ligne , le père s'éxécute avant son 3 ième fils !!!!!!!!! je m'en sors pas trés bien avec les imbrications des switch
    Un moyen simple de ralentir le père: tu lui mets un sleep(1).
    Un moyen plus pro: tu le mets en pause et un de ses fils lui envoie un signal pour le réveiller.
    Accessoirement ton ordonnanceur de switch imbriqués est vraiment très crado. Si on t'avait demandé 12 fils t'aurais imbriqué 12 switch ?
    T'aurais pu instancier une boucle
    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
    int tabPid[3];
    for (i=0; i < 3; i++)
    {
        switch(tabPid[i]=fork())
        {
              case -1: // Erreur de fork - Cas à traiter
                    break;
              case 0: // Fils
                    fils(i + 1);
                    break;
              default: // Père
                    ...
        }
    }
     
    // Ici tous les fils ont été créés - On met le père en attente
    sleep(1);
    Ne reste plus qu'à créer la fonction fils().

    Citation Envoyé par batoule80 Voir le message
    comment récupérer les valeurs 5 , 10 , 3 ?
    Communication inter processus. T'as le choix entre
    - pipe mémoire
    - pipe fichier (idiot quand le pipe mémoire est possible)
    - file de messages (msq)
    - mémoire partagée (shm)

    Si tu veux faire ça fun, tu peux lui envoyer tes nombres via communication morse au travers de signaux. SIGUSR1 représentant un trait et SIGUSR2 représentant un point. Et le père recevant ces signaux les décode et recrée le chiffre envoyé. En plus, les chiffres en morse c'est très facile car ils ont tous 5 signes
    1: .----
    2: ..---
    3: ...--
    4: ....-
    5: .....
    6: -....
    7: --...
    8: ---..
    9: ----.
    0: ------
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club Avatar de batoule80
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    merci Sve@r pour ta réponse
    Un moyen plus pro: tu le mets en pause et un de ses fils lui envoie un signal pour le réveiller.
    malheureusement on n'a pas encore entamé les signaux!!!!

    T'aurais pu instancier une boucle
    [code]int tabPid[3];
    for (i=0; i < 3; i++)
    {
    switch(tabPid[i]=fork())
    {
    case -1: // Erreur de fork - Cas à traiter
    break;
    case 0: // Fils
    fils(i + 1);
    break;
    default: // Père
    ...
    }
    }
    pour la foction fils :
    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
     
    void fils()
    {
    int i;
     
    for (i=0; i < 3; i++)
    if (i==0) {
                 return (5);
                 break;
                 }
         else if (i==1){
                           return(10);
                           break;
                           }
                    else {
                           return(3);
                           break;
                           }
    }
    est ce juste ??
    Communication inter processus.
    - file de messages (msq)
    pourrai je avoir plus de détail stp ?

    merci

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par batoule80 Voir le message
    pour la foction fils :
    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
     
    void fils()
    {
    int i;
     
    for (i=0; i < 3; i++)
    if (i==0) {
                 return (5);
                 break;
                 }
         else if (i==1){
                           return(10);
                           break;
                           }
                    else {
                           return(3);
                           break;
                           }
    }
    est ce juste ??
    As-tu lu ce que t'as écrit ? Tu instancies une boucle de 0 à 3 et dès que i vaut 0 tu quittes la fonction. A ce niveau là, c'est même plus un problème de C mais carrément toute une façon de penser à revoir !!!

    Accessoirement le comportement d'un processus fils n'est pas du tout celui d'une fonction. Tu peux pas faire "return(n)" et espérer que le père recevra la valeur n car les processus sont totalement indépendants. Faut bien voir le processus fils comme un programme à part entière. Ton "return(n)" sera reçu, dans le processus fils, par l'élément qui a appelé la fonction "fils()" (qui est de type void mais qui renvoie quand-même une valeur !!! )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/06/2008, 16h29
  2. création de plusieurs processus
    Par Paul75 dans le forum Linux
    Réponses: 5
    Dernier message: 29/01/2007, 11h22
  3. création de plusieurs threads dans WinMain
    Par ChidoriRasengan dans le forum DirectX
    Réponses: 1
    Dernier message: 15/06/2005, 21h36
  4. [DEBUTANT]Lancer plusieurs processus
    Par demontools dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/04/2005, 13h48
  5. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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