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() Gestion process


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Fork() Gestion process
    Bonjour à tous,

    Voilà L'objectif est de crée 10 génération de processus.
    Le processus père crée un fils, qui lui même crée un fils, qui lui même crée un fils, . . . . Et cela 10 fois.

    Voilà ce que j'ai actuellement

    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
     
    #include <stdio.h>
    #include <unistd.h>
     
    int main(){
    int pid;
    int pidd;
    int status;
    int i;
           switch(pid=fork()){
                case -1: printf("Error lors de la création du proc fils");
                            exit(0);
                case 0: printf("Je suis le premier fils %d  de pere %d\n", getpid(), getppid());
                            i = 0;
                            do{
                            pidd = fork();
                            switch(pidd){
                            case -1:
                                   printf("Error");
                                   exit(0);
                            case 0: 
                                   printf("Je suis le fils n°%d , %d de pere %d\n", i, getpid(), getppid();
                                   exit(0);
     
                            default:
                                   wait(NULL);
                                   printf("Je suis le père\n");
                            }
                            i++;
                            }while(i <10);
                            printf("Je sors de ma boucle\n");
                            exit(0);
                 default: wait(&status);
                            printf("Je suis le premier père\n");
                            printf("Je suis le premier fils %d de pere %d\n", getpid(), getppid());
                            exit(128);         
             }
             return 0;
    }

    Et voilà ce que j'ai en console :


    Je ne comprend pas pourquoi c'est toujours le même processus qui crée les différent fils.
    J'ai fait à coter un autre traitement avec juste des switch case imbriquer les un dans les autres. Cela fonctionne bien, j'ai bien 10 génération.

    Merci d'avance pour votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    IUT d'Auvergne ? (ça me rappelle un des exercice^^)

    Je ne comprend pas pourquoi c'est toujours le même processus qui crée les différent fils.
    Est-ce bien toi qui a écrit le code ?
    Parce que tu fais un exit(0); si c'est un fils, ce n'est donc pas étonnant qu'ils ne puissent pas créer des fils

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Heureusement d'ailleurs, sinon ça ferait une fork bomb.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Euh...
    Je sais pas mais pour moi :

    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
    int main(void)
    {
      pid_t pid;
      int i = 0;
     
      while (i < 10)
      {
         pid = fork();
         if (pid == 0)
           i++;
         else
            return (0);
      }
      return (0);
    }
    Ca ne ressemble pas vraiment à une fork bomb...
    [Désolé pour la réponse au passage ?]
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dark_fun Voir le message
    Je ne comprend pas pourquoi c'est toujours le même processus qui crée les différent fils.
    Salut
    Ton premier fils instancie une boucle do ... while et génère un nouveau fils dans cette boucle. Donc c'est normal que ce soit cet unique premier fils qui soit le père des 10 autres.
    De son coté, le père meurt juste après donc il ne peut rien générer d'autre. Et chaque petits-fils meurt aussi juste à sa création donc eux non-plus ne peuvent pas utiliser le do...while de cet unique premier fils.

    Citation Envoyé par Metalman Voir le message
    Euh...
    Je sais pas mais pour moi :

    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
    int main(void)
    {
      pid_t pid;
      int i = 0;
     
      while (i < 10)
      {
         pid = fork();
         if (pid == 0)
           i++;
         else
            return (0);
      }
      return (0);
    }
    Ca ne ressemble pas vraiment à une fork bomb...
    Ben non, tu as pensé à mettre des "return" pour bloquer. Medinoc parlait d'un code sans exit (ni de return s'y substituant)...
    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]

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu as raison, quand c'est bien fait ça n'a pas l'air d'avoir ce genre de problème.

    C'est juste que ça me fait bizarre de voir une boucle pour une chose censée s'effectuer une seule fois par processus (fork() complique vraiment les choses).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    C'est comme pour le récursif : condition d'arrêt/sortie à mettre au plus vite.

    Mais j'admets qu'à débugger c'est beaucoup plus risqué "fork()" que du récursif...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Franchement, dans le cas présent je considérerais une implémentation récursive comme plus claire:
    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
    int forkex(int (*sonFunc)(intptr_t), intptr_t sonData)
    {
    	int ret = fork();
    	if(ret == 0)
    	{
    		int sonRet = sonFunc(sonData);
    		exit(sonRet);
    	}
    	return ret;
    }
     
    int SonFunction(intptr_t mydata)
    {
    	int nbSonsCreated = (int)mydata;
    	nbSonsCreated++; /*count myself*/
     
    	if(nbSonsCreated < 10)
    		forkex(SonFunction, (intptr_t)nbSonsCreated);
    }
     
    int main(void)
    {
    	int nbSonsCreated = 0;
    	forkex(SonFunction, (intptr_t)nbSonsCreated);
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [MPI] Gestion dynamique de process
    Par chaponinho dans le forum C
    Réponses: 10
    Dernier message: 02/06/2010, 14h11
  2. gestion de flux sur un process
    Par pc974 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 26/12/2007, 09h15
  3. [Process] Gestion des flux
    Par diamonds dans le forum API standards et tierces
    Réponses: 16
    Dernier message: 30/03/2007, 15h43
  4. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  5. Gestion des process
    Par Oswald dans le forum C
    Réponses: 3
    Dernier message: 29/08/2003, 11h52

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