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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    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 chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    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 confirmé
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Par défaut
    le résultat correct est 31 sans aucun soucis mais en ajoutant \n ça change toute la philosophie

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    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 Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    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…

+ 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