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 inter-processus linux via tube nommé


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut Communication inter-processus linux via tube nommé
    Bonjour à tous,

    Je cherche à transmettre des données entre deux processus sans filiation via un tube nommé. Un processus ouvre le tube en mode écriture et l'autre en mode lecture, seulement lorsque j'exécute mes deux programmes je n'obtiens aucun résultat. J'ai aussi l'impression qu'ils s'attendent l'un et l'autre.

    Voilà si jamais vous avez une solutions à mon problème je suis preneur

    Merci et bonne journée.

    PS: le code marche j'ai testé avec un processus père et son films.

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Je pense que ton erreur est a la ligne 43. Plus serieusement, si tu ne mets pas de code on risque pas de pouvoir t'aider.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    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 476
    Par défaut
    (Je retire l'intégralité de mon message. Je n'avais pas remarqué que tu parlais dès le départ de tubes nommés).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut
    Tout d'abord merci pour votre attention.

    Voici le code de mes deux programmes:

    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
    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    main ()
    {
    char zone[11];
    int tub;
    /* ouverture du tube */
    tub = open ("fictub", O_RDONLY);
    /* lecture dans le tube */
    read (tub, zone, 10);
    printf ("processus lecteur du tube fictub: j’ai lu %s", zone);
    /* fermeture du tube */
    close(tub);
    }
    Ecrivain
    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
    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    main ()
    {
    mode_t mode;
    int tub;
    mode = S_IRUSR | S_IWUSR;
    /*création du tube nommé */
    mkfifo ("fictub", mode);
    /* ouverture du tube */
    tub = open ("fictub", O_WRONLY);
    /* écriture dans le tube */
    write (tub, "0123456789", 10);
    /* fermeture du tube */
    close(tub);
    J'essaye déjà d'utiliser les tubes nommés comme moyen de communication. Je suis tombé sur un code similaire dans mes recherches qui apparemment fonctionnait mais sans résultat pour moi.
    D'après ce que j'ai compris, mon processus écrivain qui créé le tube nommé attend l'ouverture du tube en mode lecteur d'un autre processus, ici le processus Lecteur. Cependant j'ai l'impression que mes deux programmes sont bloqués tous les deux dans l'attente de l'autre lorsque je les compile et exécute.
    Si jamais je ne trouve pas de solution j'essayerais les sockets mais j'aimerais éviter de me retrouver dans la même situation.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu devrais faire la création dans le processus lecteur, ça te laissera tout le loisir de lancer le processus écrivain pendant que le lecteur attend.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    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 476
    Par défaut
    Citation Envoyé par whoupinaiz Voir le message
    J'essaye déjà d'utiliser les tubes nommés comme moyen de communication. Je suis tombé sur un code similaire dans mes recherches qui apparemment fonctionnait mais sans résultat pour moi. D'après ce que j'ai compris, mon processus écrivain qui créé le tube nommé attend l'ouverture du tube en mode lecteur d'un autre processus, ici le processus Lecteur. Cependant j'ai l'impression que mes deux programmes sont bloqués tous les deux dans l'attente de l'autre lorsque je les compile et exécute.
    Si jamais je ne trouve pas de solution j'essayerais les sockets mais j'aimerais éviter de me retrouver dans la même situation.
    Mes excuses pour mon précédent message, j'ai posté trop vite et me suis laissé distraire. Cependant, en plus du conseil de Médinoc, voici quelques remarques :

    — Tu ne vérifies pas le code renvoyé par open("") dans tes deux programmes. De fait, tu considères tes tubes comme forcément ouverts alors qu'ils ne le sont pas forcément si une erreur s'est produite, spécialement si le tube en question n'existe pas encore. En revanche, le fait de commencer par y lire ou par y écrire n'a en principe pas d'importance ;
    — Tu as pensé à réserver un caractère de plus pour le terminateur dans zone[] mais tu ne transmets pas ce terminateur et tu n'initialises pas le tableau non plus, si bien que tu risques une segfault. Contrairement à printf() qui est faite pour gérer des chaînes, write() enverra exactement la quantité de données spécifiées, quelles qu'elles soient.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut
    D'accord merci pour vos réponses, je vais adapter ces modifications en espérant que ça marche

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut
    Alors j'ai essayé de tester la valeur renvoyé par la méthode open(), sans succès. J'ai lu que l'utilisation de tube nommé est bloquante donc je pense que le processus est bloqué en attendant l'ouverture en mode lecture/écriture de l'autre processus.

    En revanche pour vérifier que le code marche j'ai essayé de l'appliquer avec un processus père/fils et... surprise ça marche ^^ le père peut lire ce que le fils à écrit dans le tube nommé. Du coup je me demande si mon problème ne vient pas de la manière dont j'exécute mes deux programmes. Je compile et exécute mes deux projets l'un après l'autre avec netbeans en commençant par le processus qui créé le tube bien sur et j'ai bien l'impression qu'ils sont exécutés tous les deux mais peut-être que je me trompe.

    Je suis un peu à court d'idées, si vous avez un avis sur la question je suis toujours preneur

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

Discussions similaires

  1. 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
  2. Communication inter-processus via pipe()
    Par Invité dans le forum C
    Réponses: 1
    Dernier message: 04/12/2011, 15h42
  3. [windows] Communication inter-processus
    Par litbos dans le forum Windows
    Réponses: 6
    Dernier message: 16/01/2007, 09h13
  4. [débutant] Communication inter-processus
    Par tooney dans le forum C
    Réponses: 3
    Dernier message: 29/12/2005, 20h48
  5. communication inter-processus
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 09h55

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