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 :

Communiquer avec une application ouverte


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut Communiquer avec une application ouverte
    Bonjour,

    Je souhaite communiquer avec une application qui est déjà lancée.
    Je suis sous Ubuntu, donc je pense que je dois récupérer le Pid de l'appli.
    Ça c'est pas un problème par contre comment communiquer en C avec cette appli, quelle bibliothèque dois-je utiliser?

    Merci pour toute informations.

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Communiquer avec une appli ?
    Sachant que les programme ne partage pas leur mémoire je vois mal comment tu peux communiquer avec les autres programmes.
    Sauf si c'est ton programme , tu peux partager les donné via un fichier sur le DD (mais ça peut etre lourd) , soit avec les arguments qu'on passe en lançant un programme genre ./monprogramme argument1 agument2 ect.

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    879
    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 : 879
    Par défaut
    Tu ne peux communiquer avec un autre programme (autrement qu'en lui envoyant des signaux) que si ce dernier peut lire ce que tu lui envoies (par reseau, semaphore, fichier...). Si le programme en question n'a aucune de ces fonctions, il n'y a pas de moyens de communiquer avec lui (tout du moins pas a ma connaissance).

  4. #4
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par imperio Voir le message
    Tu ne peux communiquer avec un autre programme (autrement qu'en lui envoyant des signaux) que si ce dernier peut lire ce que tu lui envoies (par reseau, semaphore, fichier...). Si le programme en question n'a aucune de ces fonctions, il n'y a pas de moyens de communiquer avec lui (tout du moins pas a ma connaissance).
    Tu peux injecter une dll dans l'espace memoire d'un autre processus via ptrace et __dl_open de la libc. Le probleme, c'est que cette fonction n'est pas exportee, et que cela demance de trouver son addresse au runtime (via /proc/pid/maps) et de l'appeller en assembleur. En gerant eip/rip, tu peux donner le control a un point d'entre dans ta dll au chargement. C'est sale, mais ca marche. Hotpatch et injectso (32 bits seulement) utilisent ce mechanisme. Pour plus d'info sur la methode, voir phrack 59
    Ca permet d'injecter du code dans un processus qui tourne et ensuite eventuellement de partager des donnees via shm.

    Apres, est-ce que c'est une bonne idee...

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Par défaut
    Salut

    Citation Envoyé par dahtah
    Tu peux injecter une dll dans l'espace memoire d'un autre processus via ptrace et __dl_open de la libc
    Le problème avec cette technique c'est que les systèmes de sécurité vont criés je pense (anti-virus) car c'est rarement honnête l'injection de code dans un programme en cours

    Remarque sous Ubuntu, les anti-virus c'est pas très courant mais je te déconseille cette option surtout si tu comptes exporter vers d'autres plateformes ton projets

    Sinon pour communiquer entre deux processus tu peux utiliser les pipes

    Voir un tuto ici

    Salut,

    Neyort

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Un grand merci à tout le monde.

    Vous m'avez donné des pistes plus qu’intéressantes, maintenant je vois dans quelle direction je dois chercher. :ccool

  7. #7
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Evite en effet la méthode de dahtah... car même si c'est "réalisable", comme il le dit "indirectement" : ça n'est absolument pas fait pour.

    Avec ta réponse et celle de Neyort, je suppose que tu as accès aux sources du programme qui fonctionne...
    Et dans ce cas, tu peux utiliser n'importe quelle IPC en général (dont les pipes).

    La liste que j'ai en tête (probablement pas exhaustive) :

    • Pipes
    • Socket
    • FIFO
    • Fichier partagé + sémaphore
    • Message Queue


    Les pipes sont un peu compliqués...
    Peut être devrais-tu regarder les socket UNIX (qui restent locales) ou les FIFO pour t'éviter l'ouverture/fermeture de pipes + le fork initial qui te fera TOUT changer dans le programme quasiment...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Le mot-clé à chercher dans Google est "interprocess communication". Voir par exemples http://en.wikipedia.org/wiki/Inter-p..._communication ou http://www.advancedlinuxprogramming....p-ch05-ipc.pdf. Sous Linux, j'ai souvent entendu parler de D-Bus mais je ne l'ai jamais utilisé.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 544
    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 544
    Par défaut
    Hello,

    Citation Envoyé par dashed Voir le message
    Je souhaite communiquer avec une application qui est déjà lancée.>
    Ça dépend du contexte : soit c'est un exercice scolaire ou bien deux processus distincts mais lancés en même temps dans le même contexte et, dans ce cas, tu devras probablement utiliser les tubes (pipes), soit c'est une vraie application conçue pour les Linux récents, qui vit sa vie mais que l'on doit pouvoir contrôler ou interroger depuis un client en ligne de commande et/ou que l'on souhaite éviter de lancer « en double ».

    Dans ce dernier cas, la méthode privilégiée est effectivement les sockets UNIX mais tu peux également utiliser DBus, comme suggéré par Bktero. Cela dépendra en fait du niveau d'intégration avec le reste du système que tu veux donner à ton application.

    Par contre, de grâce, n'alloue pas un port TCP/IP si tu n'as pas explicitement l'intention de la faire communiquer par le réseau.

    Citation Envoyé par Metalman Voir le message
    La liste que j'ai en tête (probablement pas exhaustive) :

    • Pipes
    • Socket
    • FIFO
    • Fichier partagé + sémaphore
    • Message Queue
    Il faut aussi citer les tubes nommés, utilisés notamment par le spooler de l'imprimante et surtout les segments de mémoire partagée qui sont assurément la façon la plus efficace de communiquer des informations mais à qui il manque la possibilité de « signaler » l'arrivée de nouvelles données.

    Pour ce faire, on peut soit utiliser les signaux Unix, soit les pipes. Les premiers sont pratiques mais ont plusieurs inconvénients : ils engendrent un certain overhead, ils préemptent le processus, et ne peuvent pas se cumuler (ils fonctionnent dans le même esprit que les IRQ). En outre, n'importe qui peut envoyer indûment un signal au processus et cela limite l'extensibilité de la chose : si plusieurs clients communiquent avec ton application, elle ne peut pas savoir lequel a envoyé le signal.

    Utiliser les pipes permet de faire tout cela proprement, mais les tubes anonymes doivent être ouverts à l'avance, ne peuvent être rouverts s'ils ont été fermés et du côté des tubes nommés, il en faut un par client. C'est pourquoi pratiquement tout le monde se rabat sur les sockets BSD qui sont reconnus aujourd'hui par tous les Unix.

    Citation Envoyé par Bktero Voir le message
    Le mot-clé à chercher dans Google est "interprocess communication". Voir par exemples http://en.wikipedia.org/wiki/Inter-p..._communication ou http://www.advancedlinuxprogramming....p-ch05-ipc.pdf. Sous Linux, j'ai souvent entendu parler de D-Bus mais je ne l'ai jamais utilisé.
    DBus est vraiment très intéressant en soi. Le projet a atteint depuis un moment déjà la masse critique qui permet d'inciter les développeurs à s'appuyer dessus. Cela dit, il est relativement lourd à mettre en œuvre et à exploiter et cela implique qu'il soit déjà lancé. Ça veut dire aussi que l'application doit déjà communiquer avec DBus avant même de communiquer avec son client.

    Donc, on peut faire un choix entre des sockets UNIX simples et une architecture autour de DBus mais l'idéal serait de pouvoir activer l'un indépendamment de l'autre.

Discussions similaires

  1. Communiquer avec une application cliente
    Par Invité dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 01/06/2011, 17h27
  2. communiquer avec une application c++
    Par maa dans le forum C#
    Réponses: 10
    Dernier message: 25/10/2010, 10h13
  3. Communiquer avec une application en arrière plan
    Par ZMJUVENTINO dans le forum Général Java
    Réponses: 4
    Dernier message: 11/02/2009, 15h39
  4. Communiquer avec une application
    Par ZMJUVENTINO dans le forum Général Java
    Réponses: 3
    Dernier message: 28/01/2009, 01h40
  5. Créer un service Web et communiquer avec une application lourde
    Par fabseven dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 10/03/2008, 21h22

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