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 :

probleme des processus fork()


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 17
    Points
    17
    Par défaut probleme des processus fork()
    Bonjour à tous,

    J'ai besoin d'aide sur cette exercice


    Nom : 56.jpg
Affichages : 1724
Taille : 35,6 KoNom : 555.jpg
Affichages : 1982
Taille : 21,8 Ko

    Est ce que la solution est juste????

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Non, c'est complètement faux. Tu ne devrais avoir que 4 processus au final. Réfère-toi à la valeur de retour de fork décrite dans le man.

  3. #3
    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 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Désolé imperio, ce n'est absolument pas "complètement faux". Ce serait même en fait "quasiment juste" (je ne comprends d'ailleurs pas ce -1 qu'on lui a mis). A chaque itération, le fils créé à l'itération précédente relance lui-même un fork(). Il y a juste ce "i++" dédoublé dans le cas où le fork() reste dans le père qui met un peu la zone dans les calculs (d'où son erreur où il montre 3 fils F1,F3 et F4 sous son père alors qu'il n'y a que F1 et F3 et F4 qui serait plutôt sous F8) mais on voit très bien ce qui se passe avec ce code
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    int main()
    {
    	int i;
    	for (i=0; i < 4; i++)
    	{
    		printf("pid(%d:%d) - i=%d\n", getppid(), getpid(), i);
    		if (fork() > 0)
    			i++;
    		else
    		{
    			sleep(1);
    			printf("\tfils(%d:%d): %d\n", getppid(), getpid(), i);
    		}
    	}
    	wait(NULL);
    }

    Et son résultat
    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
    $ ./fork
    pid(8486:17495) - i=0
    pid(8486:17495) - i=2
    	fils(17495:17496): 0
    pid(17495:17496) - i=1
    pid(17495:17496) - i=3
    	fils(17495:17497): 2
    pid(17495:17497) - i=3
    	fils(17497:17500): 3
     	fils(17496:17499): 3
    	fils(17496:17498): 1
    pid(1:17498) - i=2
    	fils(17498:17501): 2
    pid(17498:17501) - i=3
    	fils(17501:17502): 3
    Le père 17495 donne naissance à 17496 et 17497
    Le premier fils de niveau 1 (17496) donne naissance à 17498 et 17499 tandis que le second fils de niveau 1 (17497) donne naissance à 17500
    Le premier fils de niveau 2 (17498) donne naissance à 17501 tandis que les deux autres (17499 et 17500) ne donnent plus de fils (pour eux, "i" a dépassé 3)
    Le fils de niveau 3 (17501) donne naissance à 17502 et c'est fini. Il y a donc bien 7 fils...
    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]

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 663
    Points
    23 663
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Désolé imperio, ce n'est absolument pas "complètement faux". Ce serait même en fait "quasiment juste" (je ne comprends d'ailleurs pas ce -1 qu'on lui a mis). A chaque itération, le fils créé à l'itération précédente relance lui-même un fork(). Il y a juste ce "i++" dédoublé dans le cas où le fork() reste dans le père qui met un peu la zone dans les calculs (d'où son erreur où il montre 3 fils F1,F3 et F4 sous son père alors qu'il n'y a que F1 et F3 ce qui donne au final 7 processus et non 8) mais on voit très bien ce qui se passe avec ce code
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    int main()
    {
    	int i;
    	for (i=0; i < 4; i++)
    Attention ! Il est écrit « i < 3 » et pas « i < 4 » dans le code initial !

  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 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Attention ! Il est écrit « i < 3 » et pas « i < 4 » dans le code initial !
    Zut, t'as raison. Il a dû faire la même erreur que moi

    En remplaçant 4 par 3 et en améliorant un peu la gestion de l'attente des fils en final (remplacer wait(NULL); par while(wait(NULL) > 0);), voilà ce que ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ./fork
    pid(8486:17826) - i=0
    pid(8486:17826) - i=2
    	fils(17826:17827): 0
    pid(17826:17827) - i=1
    	fils(17826:17828): 2
    	fils(17827:17829): 1
    pid(17827:17829) - i=2
    	fils(17829:17830): 2
    Le père 17826 donne naissance à 17827 et 17828
    Le premier fils de niveau 1 (17827) donne naissance à 17829 tandis que le second fils (17828) ne donne rien ("i" a dépassé 3)
    Le fils de niveau 2 (17829) donne naissance à 17830 et c'est fini. Il y a donc bien 4 fils... (encore désolé imperio)

    Je me suis amusé à tester plusieurs valeurs de "i". Pour i=2, ça donne 1 fils. Pour i=3, ça donne 4 fils. Pour i=4, ça donne 7 fils, pour i=5 ça donne 12 fils, pour i=6 ça en donne 34 et pour i=7 ça en donne 49. Probable qu'il doit y avoir une formule générique qui donne directement le nombre de fils mais je ne suis pas arrivé à la trouver...
    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
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Désolé imperio, ce n'est absolument pas "complètement faux". Ce serait même en fait "quasiment juste" (je ne comprends d'ailleurs pas ce -1 qu'on lui a mis). A chaque itération, le fils créé à l'itération précédente relance lui-même un fork(). Il y a juste ce "i++" dédoublé dans le cas où le fork() reste dans le père qui met un peu la zone dans les calculs (d'où son erreur où il montre 3 fils F1,F3 et F4 sous son père alors qu'il n'y a que F1 et F3 et F4 qui serait plutôt sous F8) mais on voit très bien ce qui se passe avec ce code
    Ah oui, en effet ! Je devais être bourré quand j'ai lu son code...

Discussions similaires

  1. [SDL 1.2] Dessiner des images SDL dans des processus fork()
    Par DiR95 dans le forum SDL
    Réponses: 5
    Dernier message: 27/03/2015, 11h33
  2. probleme des processus fork()
    Par nadine01 dans le forum Linux
    Réponses: 11
    Dernier message: 19/11/2014, 23h37
  3. Réponses: 2
    Dernier message: 29/03/2007, 17h43
  4. Probleme processus Fork PERL
    Par djezair31 dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2006, 16h00
  5. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57

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