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

Linux Discussion :

Erreur programation système


Sujet :

Linux

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Erreur programation système
    Bonjour j'ai un problème ,
    Lors de l'appel de la fonction fork(), le processus créer ré-exécute le code du processus père.
    Ainsi si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("toto"); fork();
    le résultat est totototo.
    Merci par avance pour votre aide.
    je penche pour une erreur au niveau du buffer puisque si je met un \n a la fin du toto l'erreur n'est pas produite mais le projet que j'ai en cours m'oblige a ne pas utiliser ce subterfuge.

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Intercale un "fflush(stdout)" entre le printf et le fork pour bien vider le buffer (c'est ce que qui est fait quand il y a un '\n') et tu n'auras qu'un "toto" sur la sortie standard.

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Quant à l'explication, voici ce que j'en comprends. Le fils ne réexecute pas le code du père (il n'y a pas de nouveau 'printf("toto")' après l'appel à fork()).

    Une fois le fork exécuté, tu as 2 processus identiques, au pid près, avec le même contexte (et le même état du buffer d'entrées-sorties)

    Le printf ne vide pas le buffer (pas de '\n') donc, quand le processus fils s'arrête, le système sait qu'il doit vider le buffer et écrire son sontenu. C'est ce qu'il fait dans le père ET dans le fils, d'où les deux "toto"

    Quand tu mets un '\n', le buffer est vidé et, après le fork, le processus fils (qui est la copie du père) n'a pas de données non encore écrites dans le buffer => 1 seul "toto", écrit avant le fork.

    Un petit bout de code qui montre tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    int main(int argc,char *argv[])
    {
            printf("toto(%lu)",(unsigned long)getpid());
            fork();
            printf("je suis %lu",(unsigned long)getpid());
    }
    qui donne chez moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto(9528)je suis 9528toto(9528)je suis 9529

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    évite de crossposter s'il te plaît :
    http://forum.ubuntu-fr.org/viewtopic.php?id=323922

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Erreur programation système
    Désolé pour le "cross... " je savais pas que c'était interdit....

    Puis merci a tous pour les réponse. fflush (stdout) résout en théorie le problème mais j'ai encore des bug annexe donc je penche pour révisé mon code puis si sa persiste je reviendrai vous faire coucou LOL.
    MERci

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

Discussions similaires

  1. Message erreur ressource système insuffisant
    Par rob1son76 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/12/2013, 18h05
  2. Réponses: 26
    Dernier message: 17/01/2012, 13h59
  3. Réponses: 2
    Dernier message: 11/06/2008, 19h16
  4. Procédures stockées : erreur sql système
    Par marina_b44 dans le forum AS/400
    Réponses: 7
    Dernier message: 09/06/2008, 16h26
  5. Réponses: 0
    Dernier message: 10/01/2008, 23h28

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