Communication entre deux programmes sous Linux

Communication entre deux programmes sous Linux - C - Programmation

Marsh Posté le 09-04-2005 à 00:49:57    

bonjour à tous,
 
voila mon probleme :
 
il faut en fait que je fasse un programme C qui recupere et analyse la trace d'un autre programme lancé en parallele.
je m'explique, le premier programme "Prog1" une fois lancé, ecrit une trace dans le shell :
ex :  
PROCESSUS 1 DEMARRE
PROCESSUS 2 DEMARRE
PROCESSUS 1 EN EXECUTION
PROCESSUS 2 EN EXECUTION
...
 
et un deuxieme programme lancé en parallele dois recuperer en temps réel (probablement à l'aide d'un tube '|') cette trace pour en afficher une version graphique par exemple.
 
la premiere solution qui m'etait venue à l'esprit était donc de lancer les deux programmes comme ca : "Prog1 | Prog2" mais le probleme, c'est que le Prog2 attend la fin de l'execution du Prog1 pour recuperer la trace.
 
donc est-ce que quelqu'un aurait une idée pour palier à ce probleme ?
 
merci

Reply

Marsh Posté le 09-04-2005 à 00:49:57   

Reply

Marsh Posté le 09-04-2005 à 01:55:25    

Tu peux utiliser les tubes nommés (commande mkfifo) pour échanger des infos entre deux processus quelconques

Reply

Marsh Posté le 09-04-2005 à 05:17:30    

Freeman656 a écrit :

mais le probleme, c'est que le Prog2 attend la fin de l'execution du Prog1 pour recuperer la trace.


Absolument pas.

Reply

Marsh Posté le 09-04-2005 à 08:41:59    

matafan a écrit :

Absolument pas.


 
 
non c'est clair, il y a quand meme un peu de parralalisme  :D , sinon j'aimagien meme pas la taille des buffers necessaires parfois  :o .
 
Les tubes nommés c'est assez simple a utiliser :)


---------------
.
Reply

Marsh Posté le 09-04-2005 à 09:00:55    

je peux vous assurer qu'il y a attente de la part du deuxieme programme puisqu'en fait c'est le resultat de la sortie standart du Prog1 qui est passée en parametre au Prog2.
 
Et en ce qui concerne les tubes nommés, le hic c'est que le Prog1 est en C et le Prog2 est en Java donc le format des tubes n'est probablement pas le même...(à tester quand même merci :) )

Reply

Marsh Posté le 09-04-2005 à 16:18:20    

Freeman656 a écrit :

je peux vous assurer qu'il y a attente de la part du deuxieme programme puisqu'en fait c'est le resultat de la sortie standart du Prog1 qui est passée en parametre au Prog2.


Je peux t'assurer que tu as tort. Et d'ailleurs la sortie de Prog1 n'est pas "passée en parametre au Prog2", elle est envoyée sur l'entrée standard de Prog2. Un caractère émis par Prog1 sur stdout est immédiatement disponible en lecture sur stdin de Prog2. Poste un peu ton code, qu'on rigole...
 
Tu tu veux t'en convaincre, essaie ça :

while :; do echo -n .; sleep 1; done | cat


Message édité par matafan le 09-04-2005 à 16:18:40
Reply

Marsh Posté le 09-04-2005 à 18:49:15    

Freeman656 a écrit :

il faut en fait que je fasse un programme C qui recupere et analyse la trace d'un autre programme lancé en parallele.
je m'explique, le premier programme "Prog1" une fois lancé, ecrit une trace dans le shell :


Tu veux probablement dire "écrit une trace à l'écran"
 

Freeman656 a écrit :

la premiere solution qui m'etait venue à l'esprit était donc de lancer les deux programmes comme ca : "Prog1 | Prog2"


 
Si "Prog1" écrit sur la sortie standard "stdout" et que "Prog2" lit l'entrée standard "stdin" alors ya aucun pb

Reply

Marsh Posté le 09-04-2005 à 20:08:32    

Je n'ai malheureusement pas les sources sur moi, j'espere juste que vous avez raison :)
Je vous ferai part de mes resultats lundi quand j'aurai regardé ca.
 
merci

Reply

Marsh Posté le 12-04-2005 à 15:46:06    

bon, j'ai retesté un peu ces programmes,
 
en fait c'etait très simple, il manquait un fflush(stdout) à chaque affichage...
 
merci pour votre aide ;)

Reply

Marsh Posté le 12-04-2005 à 17:40:17    

le mieux encore dans ce cas la est d'utiliser le standart d'erreur, car il se vide automatiquement à chaque fois...

Reply

Marsh Posté le 12-04-2005 à 17:40:17   

Reply

Marsh Posté le 12-04-2005 à 18:26:44    

moi23372 a écrit :

le mieux encore dans ce cas la est d'utiliser le standart d'erreur, car il se vide automatiquement à chaque fois...


 
Hum... le stderr est fait pour un usage bien particulier, pas pour masquer une erreur de programmation (sans vouloir vexer Freeman656 qui, j'en suis sûr, n'oubliera plus les fflush à l'avenir)
En plus, comment rediriger le flux "stderr" dans un pipe ?
 
Il y a aussi l'autre solution de mettre un "\n" en fin d'affichage => vidage instantané

Reply

Marsh Posté le 12-04-2005 à 20:26:44    

On peut aussi utiliser setbuf pour passer stdout en mode "unbuffered".
 
Mais bon le "\n" ou fflush(), ça convient dans la majorité des cas.
 


Message édité par SomeBugsInMe le 12-04-2005 à 20:27:32
Reply

Marsh Posté le 12-04-2005 à 20:40:30    

bin justement, le \n y etait ! c'est ce qui m'a paru bizarre...
 
voila une simplification de ce que je fais dans le prog1

Code :
  1. int main()
  2. {
  3.   printf("1\n" );
  4.   printf("2\n" );
  5.   sleep(5);
  6.   return 0;
  7. }


 
dans le prog2
 

Code :
  1. int main()
  2. {
  3.   int a,b;
  4.   scanf("%d",&a);
  5.   scanf("%d",&b);
  6.   printf("Resultat : %d, %d",a,b);
  7.   return 0;
  8. }


 
et je lance avec
prog1 | prog2
 
donc ca, ca marche mais qu'à moitié (ca attend la fin de l'execution de prog1)
 
mais en rajoutant les fflush(stdout) apres chaque printf(), c'est bon...

Reply

Marsh Posté le 12-04-2005 à 23:18:52    

Freeman656 a écrit :

bin justement, le \n y etait ! c'est ce qui m'a paru bizarre...
 
voila une simplification de ce que je fais dans le prog1

Code :
  1. int main()
  2. {
  3.   printf("1\n" );
  4.   printf("2\n" );
  5.   sleep(5);
  6.   return 0;
  7. }


 
dans le prog2
 

Code :
  1. int main()
  2. {
  3.   int a,b;
  4.   scanf("%d",&a);
  5.   scanf("%d",&b);
  6.   printf("Resultat : %d, %d",a,b);
  7.   return 0;
  8. }


 
et je lance avec
prog1 | prog2
 
donc ca, ca marche mais qu'à moitié (ca attend la fin de l'execution de prog1)
 
mais en rajoutant les fflush(stdout) apres chaque printf(), c'est bon...


 
Hum... ça paraît bon (je testerai demain au travail pour en être sûr)
petite remarque pour prog2: mettre un "\n" dans le "printf" =>

printf("Resultat : %d, %d\n",a,b);

!!!


Message édité par Sve@r le 13-04-2005 à 21:27:16
Reply

Sujets relatifs:

Leave a Replay

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