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

  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
    868
    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 : 868
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    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 392
    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 392
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    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

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    Citation Envoyé par whoupinaiz Voir le message
    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.
    Comment ça, « sans succès » ? open te renvoie forcément une valeur. Si le processus bloque, c'est forcément à l'étape d'après, c'est-à-dire la lecture ou l'écriture. Qu'obtiens-tu en ajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        printf ("Valeur de tub : %d\n",tub);
    … juste après open() (mais avant le reste) ?

    Note : ce code est à ajouter dans les deux processus. Ajoute éventuellement la mention « lecteur » ou « écrivain » dans le printf pour distinguer les deux.

    EDIT : je suis soudain pris d'un très gros doute. Est-ce que tu lances bien tes deux processus, même si c'est l'un après l'autre (par exemple chacun dans son terminal) ou bien est-ce que tu attends de récupérer la ligne de commande dans le shell courant pour lancer le premier puis le second ? Auquel cas tu risques effectivement d'attendre longtemps (sauf à utiliser l'opérateur « & » dans le shell).

    EDIT 2 : Je ne sais pas comment fonctionne Netbeans mais si tu as créé deux projets distincts pour tes processus lecteur et écrivain, il y a de fortes chances pour qu'ils logent chacun dans un répertoire propre et que, donc, le tube nommé soit visible uniquement par l'un des deux programmes. Dans le cas contraire, il faut vérifier si le lancement d'un programme ne provoque pas automatiquement l'arrêt du précédent. Le plus simple reste quand même l'utilisation d'une ligne de commande.

  10. #10
    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
    Ok merci de m'apprendre les bases ça marche mieux comme ça

    Je débute sous linux et en prog système, je n'utilisais qu'un seul terminal en effet. En fait j'essayais de compiler et exécuter les deux programmes via mon ide mais ça reporte au même problème.

    En tout cas merci pour tes réponses rapides et efficaces

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    Citation Envoyé par whoupinaiz Voir le message
    Ok merci de m'apprendre les bases ça marche mieux comme ça

    Je débute sous linux et en prog système, je n'utilisais qu'un seul terminal en effet. En fait j'essayais de compiler et exécuter les deux programmes via mon ide mais ça reporte au même problème.
    Le plus simple quand on étudie les tubes nommés est effectivement d'ouvrir deux terminaux côte à côte. Non seulement c'est plus facile pour les lancer mais le résultat apparaît également plus clairement.

    Sinon, tu peux lancer un programme sous la ligne de commande avec son nom suivi de « & » (avec un espace entre les deux). Cela aura pour effet de lancer ton programme en arrière-plan.

    En tout cas merci pour tes réponses rapides et efficaces
    À ton service.
    Bon courage.

+ 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