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 :

bizarrerie avec l'appel system read sous linux.


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut bizarrerie avec l'appel system read sous linux.
    Bonjour,
    quand je fais un read sur l'entrée standard juste apres un printf, il se passe quelque chose de bizarre.

    printf("bonjour: ");
    read(0,buffer,BUFFER);
    printf("%s", buffer);

    Il m'affiche le buffer avant le mot "bonjour".
    Ca me fait ca uniquement sous linux, pas de probleme avec windows.
    Quelqu'un sais d'ou ça pourrait venir?

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut Re: bizarrerie avec l'appel system read sous linux.
    Citation Envoyé par Hypnocrate
    Bonjour,
    quand je fais un read sur l'entrée standard juste apres un printf, il se passe quelque chose de bizarre.

    printf("bonjour: ");
    read(0,buffer,BUFFER);
    printf("%s", buffer);

    Il m'affiche le buffer avant le mot "bonjour".
    Ca me fait ca uniquement sous linux, pas de probleme avec windows.
    Quelqu'un sais d'ou ça pourrait venir?
    Essaye avec un \n derriere bonjour: normalement le bonjour s'affichear avant. C'est a cause d'une histoire de bufferisation avec printf il me semble.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Tu es sûr qu'il t'affiche bien le buffer avant le mot "bonjour"?

    Ce n'est pas un cas connu de résultat de la bufferisation de printf()...

    Ce qui serait plus compréhensible, par contre, c'est qu'il te demande le buffer avant de t'afficher le mot bonjour, puis le buffer tapé...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut :=)
    skyrunner, le hic c'est que je n'ai pas envie de mettre un \n.
    merci quand même.
    médinoc: non, il affiche bien le mot bonjour apres l'affichage du buffer.

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut Re: :=)
    Citation Envoyé par Hypnocrate
    skyrunner, le hic c'est que je n'ai pas envie de mettre un \n.
    merci quand même.
    médinoc: non, il affiche bien le mot bonjour apres l'affichage du buffer.
    J'ai juste demander d'essayer pour voir si cela fonctionne.
    Sinon tu peux faire un truc un peu crade cad une boucle de tempo (plus ou moins longue)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(i=0; i<50000; i++);

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut
    Médinoc au temps pour moi, tu as raison.
    Il affiche bien le resultat du buffer apres bonjour mais il demande le buffer avant d'afficher bonjour. tu as une explication à ça? j'aimerais qu'il affiche d'abord bonjour.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Hypnocrate
    Médinoc au temps pour moi, tu as raison.
    Il affiche bien le resultat du buffer apres bonjour mais il demande le buffer avant d'afficher bonjour. tu as une explication à ça? j'aimerais qu'il affiche d'abord bonjour.
    C'est comme je disais un probleme de bufferisation de printf...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut
    comment je pourrais resoudre ça sans faire de boucle de 50000?

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Hypnocrate
    comment je pourrais resoudre ça sans faire de boucle de 50000?
    Je viens d'essayer 2-3 trucs et je n'ai rien reussi la seule chose qui fonctionne et de mettre un \n apres bonjour

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Skyrunner
    Citation Envoyé par Hypnocrate
    comment je pourrais resoudre ça sans faire de boucle de 50000?
    Je viens d'essayer 2-3 trucs et je n'ai rien reussi la seule chose qui fonctionne et de mettre un \n apres bonjour
    Le fflush (stdout) devrait aussi fonctionner...

    http://emmanuel-delahaye.developpez....#fflush_stdout

  11. #11
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    fflush(stdout);

    <edit>
    Arf, Emmanuel

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Pouic
    fflush(stdout);

    <edit>
    Arf, Emmanuel
    Bientôt Noël

  13. #13
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Le fflush (stdout) devrait aussi fonctionner...

    http://emmanuel-delahaye.developpez....#fflush_stdout


    Ah ben oui j'avais oublié celui la...

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut
    C'est la fonction dont j'avais besoin
    Merci bien.

  15. #15
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Points : 86
    Points
    86
    Par défaut
    Une autre solution serait de n'utiliser que des appels systemes (read, write) ou que des fonctions de la famille f* (fprintf, fgets, fgetc, ...)

    Il est generalement mauvais de melanger quelque chose de buferisé et quelque chose qui ne l'est pas!

    PS: un printf basique, cad ne reconaissant que les formats %d, %u, %x, %o, %c, %s et %%, cela se code en une dizaine de fonctions de moins de 25 lignes chacune en utilisant write.

  16. #16
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par capitN.flam
    Il est generalement mauvais de melanger quelque chose de buferisé et quelque chose qui ne l'est pas!
    Seulement si on oublie de purger les buffers.

  17. #17
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par Jack_serious
    Citation Envoyé par capitN.flam
    Il est generalement mauvais de melanger quelque chose de buferisé et quelque chose qui ne l'est pas!
    Seulement si on oublie de purger les buffers.
    Oui mais dans ce cas la on perd l'interet de la bufferisation.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    en effet, mais on conserve d'autres avantages des fonctions bufferisées (avec fprintf, le formatage, par exemple. C'est à mon humble avis le grand avantage de fdopen())

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    en effet, mais on conserve d'autres avantages des fonctions bufferisées (avec fprintf, le formatage, par exemple. C'est à mon humble avis le grand avantage de fdopen())
    fdopen() n'est pas standard.
    Qu'apportent ces extensions et autres fonctions systèmes à la famille des fonctions standards de FILE* ? (fopen() etc.)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    fdopen, c'est pour utiliser les fonctions des FILE * sur ce qu'on ne peut créer que par des fonctions retournant un descripteur: tubes anonymes, sockets (Les sockets sont des descripteurs sous unixoïde, sous Windows il faut appeler _open_osfhandle avant fdopen)

    Les fonctions système de type open(), je suis d'accord avec toi, n'apportent rien (en plus, ô infamie, elles ouvrent en ASCII par défaut alors qu'elles ne sont pas dédiées au texte). Ce sont les fonctions standard qui apportent tout, fdopen() servant d'interface entre les deux.

Discussions similaires

  1. [C : system()] Problème sous Linux RH3
    Par Lucinda dans le forum C
    Réponses: 2
    Dernier message: 12/06/2007, 17h54
  2. Portage appels DeviceIoControl windows sous linux
    Par nico2022 dans le forum Linux
    Réponses: 6
    Dernier message: 23/02/2007, 15h18
  3. Réponses: 1
    Dernier message: 06/12/2006, 21h59
  4. Système embarqué sous linux
    Par chikenfrag dans le forum Applications et environnements graphiques
    Réponses: 12
    Dernier message: 16/07/2006, 01h14
  5. Réponses: 11
    Dernier message: 14/02/2006, 01h26

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