[Résolu] Communiquer entre deux processus: chose impossible ?

Communiquer entre deux processus: chose impossible ? [Résolu] - API Win32 - Programmation

Marsh Posté le 03-07-2008 à 18:34:14    

Bonjour à tous,
 
je cherche à faire quelque chose de très simple mais je n'y arrive pas et ça fait pourtant plusieurs jours que je cherche.
 
Pour résumer la chose, j'ai deux applications A et B
A tourne en permanence.
 
Je voudrais que B puisse envoyer un message à A et que A y réagisse immédiatement.
 
J'ai essayé pendant deux jours d'utiliser les NamedPipes mais apparemment ce n'est pas la bonne solution puisque je ne vois pas de moyen pour l'application A de se rendre compte qu'on vient de lui envoyer un message, sauf à vérifier l'état de son Pipe chaque milliseconde.
 
Donc voilà, je cherche un moyen pour l'application B de  dire à l'application A, "ohé réveille-toi je t'envoie un message"
 
Merci pour votre aide!


Message édité par basile238 le 24-07-2008 à 12:27:26
Reply

Marsh Posté le 03-07-2008 à 18:34:14   

Reply

Marsh Posté le 03-07-2008 à 18:43:14    

socket ?


---------------
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Reply

Marsh Posté le 03-07-2008 à 19:06:12    


 
Ca me gêne un peu car je crois que le pare-feu risque de s'en mêler non ?
Je n'ai pas accès au pare-feu étant donné que le logiciel sera installé sur plusieurs machines auxquelles je n'ai pas accès.
 

Reply

Marsh Posté le 03-07-2008 à 19:13:07    

pipe, tube nommé, socket, socket unix, mémoire partagée, etc
 
y a aucun problème à surveiller un canal d'E/S pour voir si quelque chose arrive, tu n'es pas obligé de faire de l'attente active hein

Reply

Marsh Posté le 03-07-2008 à 19:22:48    

Ca va pas faire ramer le truc si je vérifie tous les dizièmes de secondes si un truc arrive ?

Reply

Marsh Posté le 03-07-2008 à 19:24:06    

Je trouve ça un peu dommage de vérifier plusieurs fois par seconde alors que le message va typiquement être envoyé 2 ou 3 fois par jour.
J'ai l'impression que c'est un peu du gachis toutes ces vérifications pour rien.

Reply

Marsh Posté le 03-07-2008 à 19:36:04    

basile238 a écrit :

Je trouve ça un peu dommage de vérifier plusieurs fois par seconde alors que le message va typiquement être envoyé 2 ou 3 fois par jour.
J'ai l'impression que c'est un peu du gachis toutes ces vérifications pour rien.


Mais personne ne fait comme ça ... par exemple tu fais un poll/select/epoll et voilà ...

Reply

Marsh Posté le 04-07-2008 à 11:24:39    

Taz a écrit :


Mais personne ne fait comme ça ... par exemple tu fais un poll/select/epoll et voilà ...


 
Merci pour ta réponse. Je  vais essayer de me documenter sur les poll/select auquel je ne connais absolument rien pour le moment.
D'après ce que j'ai lu jusqu'à présent, sous Windows ça ne marche qu'avec les sockets. N'y a-t-il pas un moyen de faire ça avec  des fonctions  non réseaux (comme je disais plus haut, j'ai peur que le  pare-feu s'en mêle) ?

Reply

Marsh Posté le 04-07-2008 à 13:12:53    

Bon bref, moi qui pensais que c'était simple de communiquer entre deux applications.
Les Named Pipes ça sert à rien et les sockets c'est la merde.
 
Y a pas juste moyen d'envoyer un petit bip à un processus en connaissant son pid ?

Reply

Marsh Posté le 04-07-2008 à 14:08:46    

je connais pas = c'est de la merde ?
 
 
les signaux.

Reply

Marsh Posté le 04-07-2008 à 14:08:46   

Reply

Marsh Posté le 04-07-2008 à 14:14:55    

PostMessage() :??:

Message cité 1 fois
Message édité par kao98 le 04-07-2008 à 14:15:03

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 04-07-2008 à 15:05:52    

Taz a écrit :

je connais pas = c'est de la merde ?


 
J'ai pas dit "c'est de la merde" mais "c'est la merde" nuance.
"C'est la merde"parce-que je ne peux peux pas me permettre que l'utilisateur bloque mon appli juste parce-qu'il aura configuré son pare-feu d'une manière ou d'une autre.  
 
 
 

Taz a écrit :

les signaux.


 
C'est gentil de me sortir des mots-clés mais ça m'aide pas beaucoup. Les signaux, ça fait  longtemps que j'ai regardé ce qu'il pouvaient faire pour moi sur wiki, sur msdn et sur pas mal d'autres sites: apparemment pas grand chose, surtout que je suis sous windows.
Maintenant si tu as des  idées un peu plus précises à me proposer sur les signaux (fonctions à utiliser par exemple) je suis preneur.
Comment, sur Windows, envoyer un signal à une application en connaissant seulement son pid ?
Comment, sur Windows, permettre à une application d'intercepter les signaux qu'on lui envoie ?

Reply

Marsh Posté le 04-07-2008 à 15:09:10    

kao98 a écrit :

PostMessage() :??:


 
Malheureusement, PostMessage() est fait pour communiquer entre deux fenêtres différentes. Or ma première application n'est pas une application fenêtrée. En plus, étant donné qu'il s'agit de deux applis différentes, il faudrait qu'elles puissent communiquer entre elle pour que  l'une donne son identifiant de fenêtre à l'autre, ce qui nous ramène au problème initial.

Reply

Marsh Posté le 04-07-2008 à 15:53:32    

Oué, c'est relativement simple d'envoyer un signal à une appli Win32. C'est juste que Microsoft utilise une API complètement différente. Quand on y regarde de plus près c'est pas si différent que ça des API Posix.
 
La base en Win32, c'est le handle. Ça représente un descripteur sur tout et n'importe quoi, fenêtre, thread, process, mutex, semaphore, pipe, socket, fichiers, ... Tu as une fonction magique pour savoir s'il y a eu du changement sur un handle : WaitForSingleObject (et la toute famille associée). Le terme "changement" dépend évidemment de ton objet. Un thread et un process, c'est lorsqu'il quitte. Un mutex c'est lorsque tu obtiens le lock, une sémaphore, c'est lorsque l'entier est >0, etc ... vois la doc de WaitForSingleObject.
 
Donc tu peux faire ça avec une sémaphore, du genre :
 
Processus en attente de signal :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6. HANDLE sem = CreateSemaphore(NULL, 0, 1000, "MY_SEMAPHORE" );
  7. switch (WaitForSingleObject(sem, INFINITE)) {
  8. case WAIT_OBJECT_0:
  9.  fprintf(stderr, "J'ai recu un signal d'une autre appli...\n" );
  10.  break;
  11. case WAIT_TIMEOUT:
  12.  fprintf(stderr, "Timeout ...\n" );
  13.  break;
  14. case WAIT_ABANDONED:
  15.  fprintf(stderr, "Deja recu ...\n" );
  16.  break;
  17. }
  18. return 0;
  19. }


 
Processus qui envoie le signal :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6. HANDLE sem = CreateSemaphore(NULL, 0, 1000, "MY_SEMAPHORE" );
  7. fprintf(stderr, "Le process en attente va recevoir un signal ....\n" );
  8. Sleep(1000);
  9. ReleaseSemaphore(sem, 1, NULL);
  10. return 0;
  11. }


 

Reply

Marsh Posté le 04-07-2008 à 19:08:21    

Merci tpierron!
Je me disais bien qu'il devait y avoir une solution simple.
Ca marche du feu de Dieu!
 

Reply

Marsh Posté le 04-07-2008 à 22:34:38    

Tu peux aussi faire la même chose avec les Event
http://msdn.microsoft.com/en-us/li [...] S.85).aspx

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed