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 :

un probleme avec fork()


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 56
    Points
    56
    Par défaut un probleme avec fork()
    Bonjour .
    S'il vous plait je vous invite à tester ce bout de code car j'ai trouvé une chose bizarre.

    En fait ça m'affiche un nombre d'étoiles très grands
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdio.h>
    #include<sys/file.h>
    #include<unistd.h>
     
    int main()
    {
        int i=0;
        for(i=0;i<5;i++)
        {    
            fork();
            printf("*");
     
        }
    }
    ce pendant en ajoutant "\n" ça donne un résultat correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdio.h>
    #include<sys/file.h>
    #include<unistd.h>
     
    int main()
    {
        int i=0;
        for(i=0;i<5;i++)
        {    
            fork();
            printf("*\n");
     
        }
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Normalement dans les 2 cas t'as le même nombre d'étoiles (de l'ordre de !5 intuitivement), sauf que dans le second cas t'en as une par ligne.

    Quant à savoir quel est le résultat correct, ça dépend de la spécification du programme ;-)

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 56
    Points
    56
    Par défaut
    le résultat correct est 31 sans aucun soucis mais en ajoutant \n ça change toute la philosophie

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Je ne comprends pas ton problème ni ta "philosophie". Un "\n" c'est un retour à la ligne. La seule différence entre tes 2 programmes c'est que dans l'un les étoiles sont sur une même ligne alors que l'autre il y a une étoile par ligne...

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    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 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par maestroENSI Voir le message
    le résultat correct est 31 sans aucun soucis mais en ajoutant \n ça change toute la philosophie
    Je viens de faire le test chez moi aussi et je me suis donné des sueurs froides pendant une heure au moins car j'obtenais des résultats structurés…

    En fait, c'est dû à un problème très subtil : quand tu fais printf(), ce que tu écris va dans un buffer pour être envoyé vers la sortie en une fois. Or, quand tu fais fork(), le processus fils hérite de toute la mémoire du père, y compris ce qu'il maintient dans le buffer ! Le contenu de celui-ci est donc dupliqué.

    J'ai eu peur parce qu'en principe, un retour à la ligne vide ce buffer et c'est ce qui se passe chez toi. Mais sur mon Linux, apparemment, le retour à la ligne provoque bien le vidage mais pas forcément pendant le printf(), visiblement, et le fork() avait donc le temps d'hériter du buffer. Ça faisait drôle parce que, même en écrivant à l'écran le contenu de i, j'obtenais 16 tours de boucle pour i=0, 8 tours pour i=1, 4 pour i=2, etc.

    D'autre part, tu forkes avant d'afficher l'étoile et non après. Tu obtiendras donc 62 étoiles et non 31.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Oui c'est un problème classique avec fork()

    D'une manière générale c'est toujours une bonne idée de faire un fflush(NULL) avant un fork() si on ne va pas faire un exec() juste derrière.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    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 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par matafan Voir le message
    Oui c'est un problème classique avec fork() :mouarf
    Le buffer dupliqué, oui. Mais le fait d'obtenir des résultats mathématiquement cohérents dans ce cas précis m'a collé un doute…

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    En remplaçant le printf("*") lourd et bufferisé par fputc('*', stdout) léger et direct, on s'enlève une grosse épine...
    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]

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    fputc() est bufferisé, comme tout ce qui utilise les FILE *.

    Pour faire une sortie non bufferisée il faudrait soit changer la politique de bufferisation avec setvbuf(), soit faire un sortie directe avec un write() sur STDOUT_FILENO.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    fputc() est bufferisé, comme tout ce qui utilise les FILE *.
    Ouais. J'ai dit une connerie. En plus j'ai écrit fputc() en pensant à write(). Bon bref un post pour rien quoi...
    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]

  11. #11
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouais. J'ai dit une connerie. En plus j'ai écrit fputc() en pensant à write(). Bon bref un post pour rien quoi...
    ça arrive.....

    effectivement ce problème système est amusant.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    effectivement ce problème système est amusant.
    Ben surtout on apprend des choses. Parce qu'on a beau être à l'aise avec les fork(), je n'ai jamais été confronté au pb de buffer non vidé avant le fork et dupliqué dans le fils. Et si j'y avais été confronté d'un coup, j'aurais été vraiment sec. Je retiens la solution fflush(NULL) avant tout fork...
    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]

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

Discussions similaires

  1. Probleme avec la fonction 'Fork'
    Par the_cha0s dans le forum C
    Réponses: 4
    Dernier message: 24/02/2012, 16h39
  2. probleme avec le fontion fork()
    Par simovic dans le forum Unix
    Réponses: 1
    Dernier message: 05/01/2009, 13h49
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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