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 :

Comportement de sleep() avec printf


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut Comportement de sleep() avec printf
    Bonjour,

    Voici un petit problème que je n'arrive pas à comprendre avec le comportement de sleep().

    Dans le code suivant, les deux tests affichent un texte, puis endort le programme pendant 2 secondes.
    La seule différence est le saut de ligne (\n) dans le printf avant la fonction sleep.

    Lors de l'execution du premier test, le texte apparait à l'écran qu'APRES le sleep,
    tandis que dans le second test, le texte apparait AVANT le sleep.
    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
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <unistd.h>
    
    int main(void)
    {
      // Premier test
      printf("Ce texte s'affiche APRES le sleep(2)") ;
      sleep(2) ;	// Ici : Le texte s'affiche APRES le sleep
      printf("\n") ;
      printf("Fin du test...\n") ;
    
      printf("------\n") ;
    
      // Second test
      printf("Ce texte s'affiche AVANT le sleep(2)\n") ;
      sleep(2) ;	// Ici : Le texte s'affiche AVANT le sleep
      printf("Fin du test...\n") ;
    
      return 0 ;
    }
    Si quelqu'un à une explication dans ce comportement, cela serait le bienvenue

    Merci.

    OS : Linux version 2.4.27-2-386
    Compilateur : gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    printf() est bufferisée (comme on dit en français?). L'affichage se produit lorsqu'un saut de ligne ('\n') est rencontré ou lorsqu'on le force en utilisant fflush(stdout). Le sleep() n'a rien à voir là dedans, il te permet juste de voir la différence.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par DaZumba
    printf() est bufferisée (comme on dit en français?).
    printf() utilise une mémoire tampon (?)

  4. #4
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par DaZumba
    printf() est bufferisée (comme on dit en français?). L'affichage se produit lorsqu'un saut de ligne ('\n') est rencontré ou lorsqu'on le force en utilisant fflush(stdout). Le sleep() n'a rien à voir là dedans, il te permet juste de voir la différence.
    Oui, tout bêtement !
    Après quelques essais, effectivement, le '\n' déclenche l'affichage (tout comme fflush(stdout)). N'ayant pas à utilisé le '\n', j'ai forcé l'affichage par le fflush.

    Mais le comportement de printf est quand même étrange, car il pourrait afficher sur le '\0' de fin de chaîne; mais si cela a été réalisé comme ça, c'est bien pour une raison

    Merci pour cette réponse rapide

  5. #5
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Citation Envoyé par David.Schris
    printf() utilise une mémoire tampon (?)
    En fait, c'est toute la sortie standard (stdout) qui utilise une mémoire tampon, vidée sur un saut de ligne.
    D'ailleurs, l'entrée standard aussi.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    En fait, c'est toute la sortie standard (stdout) qui utilise une mémoire tampon, vidée sur un saut de ligne.
    D'ailleurs, l'entrée standard aussi.
    Euh... Le point d'interrogation n'était pas là pour ça (je sais qu'une mémoire tampon est utilisée) : je proposais une "traduction" ("bufferisée" en français) et le point d'interrogation était là pour "demander" à DaZumba si cette traduction lui convenait.
    C'est pourquoi j'ai mis le point d'interrogation entre parenthèses (pour qu'on ne croit pas que je demandais si printf() utilisait une mémoire tampon).
    Je reconnais que ce n'était pas suffisamment clair...la preuve...

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par David.Schris
    le point d'interrogation était là pour "demander" à DaZumba si cette traduction lui convenait.
    Oui, c'est une bonne traduction, en effet. En écrivant mon message, j'ai failli mettre 'printf() est tamponnée', mais je ne sais pas pourquoi, ça sonne stupide.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/04/2011, 15h46
  2. comportement non attendu avec memcpy
    Par berg dans le forum C
    Réponses: 15
    Dernier message: 23/07/2006, 00h56
  3. pb avec printf
    Par ledaker dans le forum Langage
    Réponses: 4
    Dernier message: 07/07/2006, 16h32
  4. Comportement fonctions imbriquées avec appel à Xmlhttprequest
    Par eirmag dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 04/05/2006, 17h10
  5. problème d'affichage avec printf
    Par sorari dans le forum C++
    Réponses: 12
    Dernier message: 08/03/2005, 19h30

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