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 :

Communication par tube


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut Communication par tube
    Bonsoir bonsoir,

    Je vous explique mon problème, je dois réaliser, en cours de c, deux programmes communiquant avec un tube nommée.

    L'un "serveur" et l'autre "client", voici leur fonctionnement :
    - Le serveur crée un tube dans le système de fichiers, nommé /tmp/fifo. Il ouvre ensuite ce tube en lecture,
    puis le rouvre sous forme de flux en attendant des textes envoyés par le client.
    - Le client essaye d'ouvrir en écriture seule le tube crée par le serveur. S'il n'existe pas, le processus client
    se termine.
    - Le client envoie au serveur un texte entré par l'utilisateur comme argument au programme, et il se termine.
    - Le serveur affiche à écran le texte envoyé par le client, et il reste en attente d'autres messages.


    Le résultat attendu :

    Dans un terminal :
    $ ./client bonjour
    $ ./client "comment aller vous?"
    $ ./client "y a t il quelqu un?"

    Dans un deuxième :
    $ ./serveur
    >>> bonjour
    >>> comment aller vous?
    >>> y a t il quelqu un?


    ( On doit, pour réaliser ces programmes, utiliser les fonctions suivantes : mkfifo, unlink, fopen, fputs, fgets, fclose)

    Voici le code que j'ai réalisé :

    Code du Serveur :

    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
     
    int main(int argc, char ** argv) {
     
        unlink("/tmp/fifo");
        FILE* tube = NULL;
        char text[20];
        mkfifo("/tmp/fifo",0666);
     
     
        while (1) {
            tube = fopen("/tmp/fifo","r");
            fgets(text,20,tube);
            printf(">>>>> %s",text);
            fflush(stdout);
            fclose(tube);
     
        }
     
     
     
     
        return 0;
    }
    Code du Client :

    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
     
    int main(int argc, char * argv[]) {
     
        FILE* tube = NULL;
     
        if (fopen("/tmp/fifo","r")==NULL)
            exit(0);
     
        tube = fopen("/tmp/fifo","w");
     
        fputs(argv[1],tube);
     
     
        fclose(tube);
     
        return 0;
    }

    ...Et donc ça ne marche pas..

    Bizarre puisque lorsque je tente d'écrire dans le tube "manuellement" avec "cat > /tmp/fifo" " là tout marche bien..


    Voila voila je solicite donc votre aide pour avoir une petite piste


    Bonne soirée et merci !

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    si tu lances le debuggueur (ou si tu ajoutes des printf) tu repères rapidement où il y a un appel bloquant dans le client. Une fois la ligne repérée (le fopen) tu peux essayer de changer le mode d'ouverture (tu ouvre le tube en mode read ?) Et même si l'ouverture réussissait, comment ferais-tu pour fermer le fichier que tu viens d'ouvrir ?

    Tu devrais utiliser simplement un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((tube=fopen("/tmp/fifo","w")==NULL)

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Bonjour,

    Merci beaucoup l'erreur venait bien de là, tout marche bien maintenant !

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

Discussions similaires

  1. Communication par tubes
    Par stoner dans le forum Débuter
    Réponses: 2
    Dernier message: 26/02/2013, 21h58
  2. Réponses: 0
    Dernier message: 30/10/2012, 21h34
  3. Communication inter-processus par tubes nommés
    Par arkham55 dans le forum Shell et commandes POSIX
    Réponses: 3
    Dernier message: 05/05/2012, 19h12
  4. Réponses: 4
    Dernier message: 28/10/2011, 14h42
  5. Réponses: 3
    Dernier message: 19/10/2011, 15h52

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