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

Linux Discussion :

Comment faire communiquer deux programme entre eux en C ?


Sujet :

Linux

  1. #1
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut Comment faire communiquer deux programme entre eux en C ?
    Salut !

    Je ne sais pas si ce poste a ca place ici ou dans le forum programmation Linux, donc j'espaire ne pas m'étre trompé... :^/

    Je me pose la question de savoir quel est la meilleur solution pour faire communiquer deux applications entre elle de manière la plus rapide possible en C sous Linux ? et si la rapidité est beaucoup réduite par rapport a un programme communiquant avec lui même ?

    Bon... comme un exemple vaut mieux qu'un long discourt en voici un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // programmeQuiRecoi
    void main()
    {
        int num;
        int total = 0;
        while(1)
        {
            scanf("%d\n", &num);
            total += num;
            printf("total = %d\n",num);
        }
    }
    La méthode ici pour communiquer est faite avec un scanf. En utilisant donc un pipe comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./programmeQuiEmet | ./programmeQuiRecoi
    Mais il y a plusieurs problème avec cette technique (du moins comme je l'utilise actuellement avec un pipe) :
    1> La communication ne se fait que dans un seul sens.
    2> La communication ne se fait pas petit a petit mais seulement lorsque le programme qui émet est terminé.
    3> Le programme peu communiquer avec UN seul autre programme.
    4> Pour terminer je ne suis pas sur que les performances avec cette technique soit exceptionnel non ?


    Donc en fait il faudrais un mode de communication qui se face dans les deux sens un genre de truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void main()
    {
        int num;
        int total = 0;
        while(1)
        {
            receptionDUnInt(&num);
            total += num;
            emitionDUnInt(num);
        }
    }

    Avais vous une idée de quel technique (portable si possible) utiliser pour faire cela ?

    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    Tu peux voir du côté des files nommées (fifo) ou du côté des sockets unix.
    L'avantage des sockets unix c'est que yaurait pas grand chose à changer pour en faire une application réseau.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et tu peux avoir aussi un fichier intermédiaire, ou bien de la shared memory si tu sais que tu es sur le même système...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Merci pour vos réponses.

    Gruik> OMG ! Ca a l'aire génial les FIFO !!! =) C'est comme ça que marche les drivers Unix non ?
    Si non au niveaux performance ? serais tu si c'est aussi performant qu'un appelle a une fonction internet au programme ?
    Pour les sockets c'est intéressent si on travaille en réseau mais pour un fonctionnement local, les performances risque d'être médiocre par rapport au FIFO ou a de la "shared memory" non ?

    souviron34> Bha un fichier intermédiaire risque de prendre beaucoup de temps, par contre de la "shared memory" ça peu être sympa car très rapide c'est bien ça ?

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Les fifos ont une existance dans le systeme de fichier, mais je crois que leur contenu est géré en memoire partagée (pas sur disque).
    Je crois que les sockets unix sont implementés avec des fifos (en tout cas c'etait le cas avec un kernel 2.4)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    NB : Ça s'appelle des pipes au passage.

  7. #7
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Les fifos ont une existance dans le systeme de fichier, mais je crois que leur contenu est géré en memoire partagée (pas sur disque).
    Je crois que les sockets unix sont implementés avec des fifos (en tout cas c'etait le cas avec un kernel 2.4)
    Cela signifie que l'utilisation de "sockets unix" en local est aussi rapide que les "fifos" qui est aussi rapide que de la "memoire partagée" ?

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ekinoks Voir le message
    Cela signifie que l'utilisation de "sockets unix" en local est aussi rapide que les "fifos" qui est aussi rapide que de la "memoire partagée" ?
    Non car le noyau implémente en plus pour les pipes une politique de dualité (tant que le lecteur ne lit pas, l'écrivain est bloqué et inversement) que ne font pas les sockets ni la shm. Donc plus de travail = moins de rapidité...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Merci pour ta réponse Sve@r.

    Citation Envoyé par Sve@r Voir le message
    Non car le noyau implémente en plus pour les pipes une politique de dualité (tant que le lecteur ne lit pas, l'écrivain est bloqué et inversement) que ne font pas les sockets ni la shm. Donc plus de travail = moins de rapidité...
    Ha ok... donc en fait, les FIFO se sont des drivers c'est ça ? comme les présente le tuto de Skyrunner (lien) ?

    Ou alors il y a des petites différences entre drivers Unix et les FIFO ?

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ekinoks Voir le message
    Ha ok... donc en fait, les FIFO se sont des drivers c'est ça ? Ou alors il y a des petites différences entre drivers Unix et les FIFO ?
    Non. Ce n'est pas parce que le noyau Unix implémente une politique particulière pour un fifo qu'un fifo est un driver. Un driver c'est un programme qui prend en charge un périphérique. Un fifo c'est un mécanisme de communication interprocessus pris en charge par le noyau
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Il existe de très nombreux moyens de communiquer entre deux programmes :
    • pipes nommés
    • fichiers
    • sockets
    • mémoire partagée
    • signaux
    • base de données
    • files de messages
    • ...


    Après, il ne reste plus qu'à savoir ce que tu veux transférer, si ça doit être bidirectionnel ou non, et les performances que tu attends.

    Dans ton cas, tu as précisé que tu voulais des performances et une communication bidirectionnelle, mais pas ce que tu souhaite transférer (volume et nombre de différentes valeures)
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  12. #12
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Non. Ce n'est pas parce que le noyau Unix implémente une politique particulière pour un fifo qu'un fifo est un driver. Un driver c'est un programme qui prend en charge un périphérique. Un fifo c'est un mécanisme de communication interprocessus pris en charge par le noyau
    Ha ok, je comprend mieux...

    Citation Envoyé par gangsoleil Voir le message
    Dans ton cas, tu as précisé que tu voulais des performances et une communication bidirectionnelle, mais pas ce que tu souhaite transférer (volume et nombre de différentes valeures)
    Ok... donc en fait je réfléchie à faire une sorte de... "machine graphique virtuelle" :^/
    Le principe c'est que les fenêtres graphiques soit géré par une machine virtuelle.
    Le but de la chose est de permettre a plusieurs programmes indépendant (programmer avec n'importe quel langage y compris du shell) de travailler facilement sur la même fenêtre graphique.

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    X fait ca tres bien

    (XWindow pour ceux qui ne connaissent pas)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    X fait ca tres bien

    (XWindow pour ceux qui ne connaissent pas)
    Ha bon ?? est tu sur ? car j'ai fait des recherches sur Google et j'ai trouvé aucun site qui parlait de ca...

    as tu bien compris le programme que je voulais faire ?

    Une des implications de ce programme est de pouvoir créé facilement un environnement graphique en shell pour un script shell.
    Puis pouvoir ajouter des fonctionnalités à cette application graphique en créant un second programme qui va communiquer directement avec la fenêtre graphique.
    Par exemple le second programme peu rajouté juste un bouton qui servira a quitter le programme.

    Le but est de pouvoir rajouter des fonctionnalité à l'application graphique sans avoir besoin de se plonger dans les codes sources de l'application mère et sans que celle ci est eu a prévoir cela...

    Il faut donc pour faire cela que la "machine graphique virtuelle" puissent communiquer avec les programmes qui dirige l'application graphique de manière bidirectionnelle et rapide.

    (j'ai pris l'exemple du shell mais ca peu aussi être du python du C ou autre...).



  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Ekinoks Voir le message
    Le principe c'est que les fenêtres graphiques soit géré par une machine virtuelle.
    Le but de la chose est de permettre a plusieurs programmes indépendant (programmer avec n'importe quel langage y compris du shell) de travailler facilement sur la même fenêtre graphique.
    Le X serveur fait ca..

    Maintenant, en ce qui concerne ceci :


    Une des implications de ce programme est de pouvoir créé facilement un environnement graphique en shell pour un script shell.
    Puis pouvoir ajouter des fonctionnalités à cette application graphique en créant un second programme qui va communiquer directement avec la fenêtre graphique.
    Par exemple le second programme peu rajouté juste un bouton qui servira a quitter le programme.

    Le but est de pouvoir rajouter des fonctionnalité à l'application graphique sans avoir besoin de se plonger dans les codes sources de l'application mère et sans que celle ci est eu a prévoir cela...

    Il faut donc pour faire cela que la "machine graphique virtuelle" puissent communiquer avec les programmes qui dirige l'application graphique de manière bidirectionnelle et rapide.
    eh bien tcl/tk fait tres bien ca...
    (base sur X aussi )
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Comment faire communiquer deux threads
    Par mayu5 dans le forum POSIX
    Réponses: 3
    Dernier message: 14/05/2008, 13h45
  2. [SOAP] Comment faire communiquer deux applis?
    Par r0d dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 29/04/2008, 14h45
  3. Faire communiquer deux programmes python
    Par bestdomdom dans le forum Général Python
    Réponses: 5
    Dernier message: 26/10/2006, 09h30
  4. comment faire communiquer deux form MDI?
    Par eponette dans le forum Langage
    Réponses: 3
    Dernier message: 17/08/2005, 12h20
  5. [Securité] Faire communiquer 2 serveurs entre eux
    Par Wookai dans le forum Hébergement
    Réponses: 2
    Dernier message: 10/08/2005, 00h13

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