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 :

[C/C++] Déblocage d'un flux avec fread


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut [C/C++] Déblocage d'un flux avec fread & Flush de buffer
    Bonjour à tous,

    Voilà mon problème, je suis en train de faire une petite application qui en pilote une autre en interne.
    Pour cela, je crée un pipe connecté entre mon application fils et l'application principale. Un petit coup de fork(), dup2(), fdopen() ... ect... ect.. Tout ce passe bien.

    J'arrive à avoir ainsi la sortie standard de mon application fils à travers un descripteur de fichier.
    Mais voilà, maintenant je le lit avec fread(). Et là, il y'a un problème, car mon application mère reste bloqué sur ce fread() jusqu'à ce que l'application fils se finissent d'elle même.
    Et j'obtient d'un coup toute la sortie du fils.

    Ce que je voudrais, c'est avoir "en direct" les octets écrits dans la sortie standard du fils. Je ne sais pas pourquoi ça reste coincé. (pour infos, j'ai essayé avec les fonctions *_unlocked, même chose)

    Merci d'avance à ceux qui pourront m'aider.

    Snark.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Snark
    Bonjour à tous,

    Voilà mon problème, je suis en train de faire une petite application qui en pilote une autre en interne.
    Pour cela, je crée un pipe connecté entre mon application fils et l'application principale. Un petit coup de fork(), dup2(), fdopen() ... ect... ect.. Tout ce passe bien.

    J'arrive à avoir ainsi la sortie standard de mon application fils à travers un descripteur de fichier.
    Mais voilà, maintenant je le lit avec fread(). Et là, il y'a un problème, car mon application mère reste bloqué sur ce fread() jusqu'à ce que l'application fils se finissent d'elle même.
    Et j'obtient d'un coup toute la sortie du fils.

    Ce que je voudrais, c'est avoir "en direct" les octets écrits dans la sortie standard du fils. Je ne sais pas pourquoi ça reste coincé. (pour infos, j'ai essayé avec les fonctions *_unlocked, même chose)

    Merci d'avance à ceux qui pourront m'aider.

    Snark.
    2 problèmes :

    - Pour débloquer fread -> select

    - Pour être sûr que le message parte : fflush. Sachant que fflush utilise des FILE*, il faudra que tu utilises fdopen...

    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    fflush, j'avais déjà essayé, mais ça coincé quand même.
    Pour le select, ça permet principalement de savoir si il y a des données disponibles. Or, je suis certain qu'il y'a des données. C'est bien le problème.

    Enfin, je vais quand même essayé le select, au cas où.
    Merci

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Snark
    fflush, j'avais déjà essayé, mais ça coincé quand même.
    Pour le select, ça permet principalement de savoir si il y a des données disponibles. Or, je suis certain qu'il y'a des données. C'est bien le problème.

    Enfin, je vais quand même essayé le select, au cas où.
    Merci
    Si cela coince, montre une version simplifiée de ton code, cela devrait fonctionner...

    Jc

  5. #5
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Bon, j'avance sur la résolution.
    Déjà, ça ne bloque plus grace à un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	flags = fcntl(m_pipeRead, F_GETFL, 0);
    	flags |= O_NONBLOCK;
    	fcntl(m_pipeRead, F_SETFL, flags);


    Mais j'ai remarqué que je n'avais toujours rien en sortie tant que l'application fils ne se finissait pas.
    Après quelques recherche, j'ai remarqué que c'était dû à cette application car avec d'autre application genre "mplayer" ça fonctionne.

    En l'occurence, c'est ici Blender auquel je voudrais récuperer la sortie.

    Il y'a un test simple à faire opur voir que c'est l'application :
    Dans une console :
    Dans une autre :
    On remarque que avec mplayer, on a la sortie au fur et à mesure dans le fichier (c'est tout à fait normal) mais pour Blender, le fichier ne se rempli qu'une fois qu'on le quitte !

    Donc comment forcer un "flush" de sa sortie !? (En C de préférence) C'est forcement possible vu que la console affiche bien le résultat au fur est à mesure. (Non, la fonction fflush ne fonction PAS ! )

    Désolé pour mes problèmes complexe

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    essaye avec

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    J'ai essayé pendant que tu postais justement. Mais...
    Rien à faire, ça résiste !

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    pour le fun essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    blender > out.txt | toto.txt
    avec un

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    blender > out.txt | toto.txt
    J'ai du mal a voir ce que t'as tenté de faire là !?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    le > peut être bufferisé... Le faire suivre d'un pipe permettrait peut-être (???) une écriture synchrone...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Bah, perdu

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Snark
    ..
    C'est forcement possible vu que la console affiche bien le résultat au fur est à mesure.
    ça c'est sans doute dû au fait que blender utilise des printf ou fprintf (stdout..) qui sont bufferisés, et qu'ils n'ont pas trop mis de "\n", qui flush, et
    que la console flush ce qui lui sort dessus, mais que l'écriture dans un fichier a un tampon...

    Solution... ?????

    Trouver une commande pour réduire la taille du tampon ?? (je suppose que tu ne peux pas éditer le code de blender ?)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  13. #13
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Déjà tenté de ne pas mettre de buffer à coup de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setvbuf(m_readDatas, (char *)NULL, _IONBF, 0);
    Mais non ...

    Et puis, la première chose que j'ai fait, c'est regarder son code source. Ils utilisent bien que des printf et y'a toujours des \n à la fin.

    Donc, encore un coup des extra-terrestre, je pari !!

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu as le code source ???

    tu peux recompiler ????

    Si oui, remplace les "printf" par des "fprintf(stderr,...)" ou rajoute des fflush(stdout) après chaque printf..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par souviron34
    tu as le code source ???

    tu peux recompiler ????

    Si oui, remplace les "printf" par des "fprintf(stderr,...)" ou rajoute des fflush(stdout) après chaque printf..
    Bah oui... J'ai posté dans la rubrique linux, donc c'est un logiciel libre et opensource... Et j'ai tapé plus d'un fois dans le code.
    Mais je voudrais que ça marche pour tous les Blender !! Et en plus, vu la taille du code source digne de OpenOffice, j'ai pas trop envie de commencer une modification d'envergure, juste pour moi !

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Snark
    Bah oui... J'ai posté dans la rubrique linux, donc c'est un logiciel libre et opensource... i !
    bah c'est pas équivalent......

    Il y a plein de logiciels sur linux payants et privés..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  17. #17
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par souviron34
    Il y a plein de logiciels sur linux payants et privés..
    Oui, mais pour moi, du proprio sur du libre c'est une hérésie ! (*Tentative de rattrapage de ma faute car d'habitude c'est moi qui fait la remarque* ^^)

    Sinon, ça ne me fait pas avancer mon shmilblique tout ça....

Discussions similaires

  1. probleme avec fread
    Par booby dans le forum C
    Réponses: 10
    Dernier message: 06/04/2006, 17h21
  2. Réponses: 2
    Dernier message: 18/03/2006, 19h07
  3. petit problème avec fread
    Par Myth_Titans dans le forum C++
    Réponses: 2
    Dernier message: 07/02/2006, 08h40
  4. Flux avec accès aléatoire
    Par smyley dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 29/11/2005, 02h03
  5. prblme de lecture avec fread ... etrange...
    Par toto4650 dans le forum MFC
    Réponses: 14
    Dernier message: 28/07/2005, 17h58

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