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

Bibliothèque standard C Discussion :

flusher un tube nommé


Sujet :

Bibliothèque standard C

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut flusher un tube nommé
    Bonjour,
    je fais communiquer deux processus par tube nommé.
    Le processus lecteur:
    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
     
    int main()
    {
        int retour, fd, nb;
        char data;
     
        retour = mkfifo("canal.fifo", 0600);
        if(retour < 0) {
            perror("mkfifo");
            exit(EXIT_FAILURE);
        }
     
        fd = open("canal.fifo", O_RDONLY);
        if(fd < 0) {
            perror("open");
            exit(EXIT_FAILURE);
        }
     
        printf("Le consommateur lit...\n");
        do {
    		nb = read(fd, &data, 1);
    		if(nb > 0)
    			printf("%c", data);
        }while(nb > 0);
     
        close(fd);
    	unlink("canal.fifo");
        exit(EXIT_SUCCESS);
    }
    Le processus écrivain:
    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
     
    int main()
    {
        int fd;
        char msg[64];
     
        fd = open("canal.fifo", O_WRONLY);
        if(fd < 0) {
            perror("open");
            exit(EXIT_FAILURE);
        }
     
        do
    	{
    		puts("Entrez un message: ");
    		scanf("%s", msg);
    		while(getchar() != '\n');
    		if(msg[0] == 'q')
    			break;
    		write(fd, msg, strlen(msg)+1);
    	}while(1);
        close(fd);
        exit(EXIT_SUCCESS);
    }
    Cela fonctionne à ceci près qu'il faut que je quitte l'écrivain qui fait donc un close(fd) pour que le lecteur soit débloquer de son read() et lise toutes les données accumulées dans le tube.
    Est-ce qu'il faut flusher après un write() ou ai-je mal écrit?

    Merci.

  2. #2
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour,
    je me répond à moi-même.
    Je m'en sors en faisant systématiquement des open/write/close pour transmettre mes données. Mais ça me semble incohérent pour un fonctionnement de type fifo. Ce qui est écrit devraient être automatiquement disponible à l'autre bout.
    Me trompe-je?

    Merci.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    close va faire un flush. Oui il faut faire un flush après write pour que les données soient disponibles en read à côté. C'est une optimisation pour l'écriture : on écrit plein de choses, puis on flush.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour,
    merci pour la réponse.
    Mon appli a une architecture similaire à celle d'un client/serveur dans le sens où un processus est en écoute permanente sur le tube nommé.
    Le processus "client" s'y connecte au lancement et envoie des données tant que nécessaire puis il s'arrête en faisant un close sur le descripteur du tube.
    Mon pb: cela ferme le tube et le processus client stoppe (puisqu'il n'y a plus d'écrivain?).
    Question: un processus peux t-il se déconnecter d'un tube sans qu'il se ferme?

    Merci.

Discussions similaires

  1. probleme lecture et ecriture dans les tube nommés
    Par El-Patron dans le forum POSIX
    Réponses: 0
    Dernier message: 28/11/2009, 10h58
  2. Ecriture dans un tube nommé
    Par prgasp77 dans le forum Administration système
    Réponses: 7
    Dernier message: 17/11/2009, 14h01
  3. Tubes nommés (named pipes) asynchrones
    Par piziwate dans le forum C
    Réponses: 8
    Dernier message: 18/12/2007, 19h41
  4. tube nommé en C
    Par yann999 dans le forum POSIX
    Réponses: 7
    Dernier message: 24/11/2006, 11h10
  5. Tube nommé: un casse tête
    Par yashiro dans le forum Linux
    Réponses: 2
    Dernier message: 28/06/2006, 09h11

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