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

POSIX C Discussion :

fflush() sur un pipe ?


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 12
    Points
    12
    Par défaut fflush() sur un pipe ?
    Bonsoir,

    J'essaye de faire un ptit chat client-serveur, le serveur fair un fork() pour chaque client connecté et lui dedi un child (qui n' est autre qu'un bucle pour recevoir des messages).

    Puis, une fois qu'un message est reçu, celuici est envoyé au père via un pipe(), et le père s'occupe de l'envoyer à tout le monde.

    Mais alors voila, ce que j'envoi à travers du tunnel sont des strings le problème étant celuici:

    1er message envoyé par le fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Child:
    msg = "abcdef";
    write (fold [1], msg, strlen (msg));
     
    // À travers de read () , le procès père lit "abcdef"

    2ème message envoyé par le fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Child:
    msg = "123";
    write (fold [1], msg, strlen (msg));
     
    // À travers de read () , le procès père lit "123def"
    Donc voila, les données rèstent sur le buffer du pipe ce qui produit ce genre de résultats, donc je cherche le moyen de faire un nettoyage du tunnel après chaque envoi, j'ai déjà essayé avec fflush mais pas moyen.

    Voilà, merci beaucoup pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    j'avais eu le meme probleme que toi. (enfin similaire)
    normalement un fflush apres l'ecriture (fflush n'est definit que sur des flux sortants je le rapelle) devrais regler ton probleme.

    sinon j'ai reglé mon souci avec un petit:
    setvbuf (writestream[i], NULL, _IONBF, 0);

    qui fait passer ta pipe en mode "not buffered".

    ---

    je viens de realiser un truc, tu travaille avec les appels systemes read et write ... donc directement avec les pipes.
    si tu fait un fflush sur ta pipe ... qui lui est definit pour des flux (man fflush) ça risque pas de marcher d'ailleurs, le compilo rale pas?

    personellement j'ai eu des ennuis en melangeant les appels systemes et les fonctions C sur les flux.
    la regle c'est: soit tu bosse avec des flux seulement, soit avec des file descriptor, pas avec les deux.

    y'as un exemple ici: ftp://ftp2.developpez.be/developps/l...p-ch05-ipc.pdf page 17
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Dark_Ebola
    j'avais eu le meme probleme que toi. (enfin similaire)
    normalement un fflush apres l'ecriture (fflush n'est definit que sur des flux sortants je le rapelle) devrais regler ton probleme.

    sinon j'ai reglé mon souci avec un petit:
    setvbuf (writestream[i], NULL, _IONBF, 0);

    qui fait passer ta pipe en mode "not buffered".

    ---

    je viens de realiser un truc, tu travaille avec les appels systemes read et write ... donc directement avec les pipes.
    si tu fait un fflush sur ta pipe ... qui lui est definit pour des flux (man fflush) ça risque pas de marcher d'ailleurs, le compilo rale pas?

    personellement j'ai eu des ennuis en melangeant les appels systemes et les fonctions C sur les flux.
    la regle c'est: soit tu bosse avec des flux seulement, soit avec des file descriptor, pas avec les deux.

    y'as un exemple ici: ftp://ftp2.developpez.be/developps/l...p-ch05-ipc.pdf page 17
    Salut, déjà merci pour la réponse et le lien vers ce PDF qui me semble très interessant à lire, je vais sans doute le garder dans les bookmarks avec celui de la GLIBC

    Sinon pour setvbuf(), j'ai déjà essayé, si je le plaçe après l'appel write() je ne reçois que le primer message envoyé, puis plus rien.

    J'ai aussi pensé à l'utilisation de FIFOS, c'est donc des pipes avec un nom ? Donc des "fichier virtuels", avec ses file descriptors pour y acceder c'est bien ça ?
    En fait je ne suis pas sûr si un FIFO implique ou pas l'utilisation du disque dur, car dans ce cas ça ne serait plus intéressant pour mon cas.

    Merci bien

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Je viens d'essayer avec des FIFO, il ce passe exactement la même chose et pareil pour setvbuf()

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    j'ai peur que tu confond file descriptor (int) et flux (FILE *)

    un exemple de ce qu'il faut faire:

    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
     
                [...]
    	    {
    	      readstream = fdopen (my_pipe[0], "r");
    	      writestream = fdopen (my_pipe[1], "w");
    	      if (writestream == NULL || readstream == NULL)
    		{
                      perror ("fdopen");
    		  return EXIT_FAILURE;
    		}
    	      setvbuf (writestream, NULL, _IOLBF, 0);
                  [...]
                  fprintf(writestream,"hello child !\n");
    	    }
    [...]
    c'est un bout de code qui ouvre un file * a partir d'un file descriptor.
    la fonction fdopen est ton amie.
    ensuite tu utilise fread//fwrite (ou fgets//fputs) pour lire et ecrire.
    setvbuf fait des manipulations sur le flux.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

Discussions similaires

  1. Comment passer un CString sur un pipe ?
    Par masterx_goldman dans le forum Windows
    Réponses: 2
    Dernier message: 16/09/2009, 20h22
  2. questions sur les pipes ?
    Par laracroft87 dans le forum Linux
    Réponses: 16
    Dernier message: 02/05/2009, 20h57
  3. Simuler un flux sur un pipe
    Par ph0nk dans le forum OpenGL
    Réponses: 1
    Dernier message: 16/03/2009, 17h51
  4. Problème sur des PIPEs / tubes
    Par dr4g0n dans le forum POSIX
    Réponses: 7
    Dernier message: 24/01/2008, 21h58
  5. programme en C sur les pipes
    Par morpion_35 dans le forum C
    Réponses: 1
    Dernier message: 24/03/2007, 09h49

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