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 :

Soucis avec fflush


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut Soucis avec fflush
    Bonsoir,

    J'ai un léger soucis avec un programme, en fait je ne comprends pas pourquoi il fonctionne si il y a fflush et bloque sinon:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    int main(){                                                                                            
            int tube[2];                                                                                   
            fd_set ensemble;                                                                               
            int     i = 0;                                                                                     
            char    c = 'c';                                                                               
     
            pipe(tube);                                                                                    
     
            switch(fork()){                                                                                
                    case -1:                                                                               
                            perror("fork");                                                                
                            exit(1);                                                                       
                    case 0: //Processus fils                                                               
                            while(1){                                                                      
                                    write(tube[1], &c, 1);                                                 
                                    sleep(1);                                                              
                            }                                                                              
                            break;                                                                         
                    default:                                                                               
                            while(1){                                                                      
                                    FD_ZERO(&ensemble);                                                    
                                    FD_SET(tube[0], &ensemble);                                            
     
                                    select(FD_SETSIZE, & ensemble, NULL, NULL, NULL);                      
     
                                    printf("%d ", ++i);                                                    
                                    fflush(stdout);     //Si on retire cette instruction, le programme bloque                                                 
                                    read(tube[0], &c, 1);                                                  
                            }                                                                              
            }                                                                                              
     
            return 0;                                                                                      
    }
    Je comprends pas en quoi le fait qu'on ne vide pas le buffer de stdout rende l'instruction read bloquante alors que tube[0] contient des données..

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    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 486
    Par défaut
    Ton programme n'est probablement pas bloqué mais tu écris sur la sortie sans faire de retour à la ligne. Les informations que tu sors restent donc dans le buffer.

    En outre, tu ne vérifies pas, en faisant read() si le pipe est éventuellement refermé (mort du correspondant) et le premier paramètre de select() n'est pas FD_SETSIZE mais la valeur du plus grand descripteur à surveiller + 1.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ton programme n'est probablement pas bloqué mais tu écris sur la sortie sans faire de retour à la ligne. Les informations que tu sors restent donc dans le buffer.

    En outre, tu ne vérifies pas, en faisant read() si le pipe est éventuellement refermé (mort du correspondant)
    D'accord, je comprenais pas pourquoi il y avait un affichage si je retirais le read, mais après quelques recherches, j'ai compris que c'est le buffer qui se vide car il est plein, par ailleurs, comment fait-on pour s'assurer que le read va lire sur un tube ouvert ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    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 486
    Par défaut
    Citation Envoyé par Arkenis Voir le message
    D'accord, je comprenais pas pourquoi il y avait un affichage si je retirais le read, mais après quelques recherches, j'ai compris que c'est le buffer qui se vide car il est plein, par ailleurs, comment fait-on pour s'assurer que le read va lire sur un tube ouvert ?
    Voir man read.

    read() te renvoie soit une valeur positive t'indiquant le nombre d'octets lus, soit une valeur négative en cas d'erreur, soit une valeur nulle si la fin de fichier a été atteinte ou si le tube a été refermé par l'écrivain.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    Ok ! Merci

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

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

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