Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1629 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Communication entre deux programmes sous Linux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Communication entre deux programmes sous Linux

n°1040887
Freeman656
Posté le 09-04-2005 à 00:49:57  profilanswer
 

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

mood
Publicité
Posté le 09-04-2005 à 00:49:57  profilanswer
 

n°1040926
fafounet
Posté le 09-04-2005 à 01:55:25  profilanswer
 

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

n°1040955
matafan
Posté le 09-04-2005 à 05:17:30  profilanswer
 

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.

n°1040964
didier1809
${citation_perso}
Posté le 09-04-2005 à 08:41:59  profilanswer
 

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 :)


---------------
.
n°1040967
Freeman656
Posté le 09-04-2005 à 09:00:55  profilanswer
 

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 :) )

n°1041356
matafan
Posté le 09-04-2005 à 16:18:20  profilanswer
 

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
n°1041471
Sve@r
Posté le 09-04-2005 à 18:49:15  profilanswer
 

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

n°1041522
Freeman656
Posté le 09-04-2005 à 20:08:32  profilanswer
 

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

n°1044388
Freeman656
Posté le 12-04-2005 à 15:46:06  profilanswer
 

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 ;)

n°1044594
moi23372
Posté le 12-04-2005 à 17:40:17  profilanswer
 

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

mood
Publicité
Posté le 12-04-2005 à 17:40:17  profilanswer
 

n°1044648
Sve@r
Posté le 12-04-2005 à 18:26:44  profilanswer
 

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é

n°1044849
SomeBugsIn​Me
life suxx
Posté le 12-04-2005 à 20:26:44  profilanswer
 

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
n°1044871
Freeman656
Posté le 12-04-2005 à 20:40:30  profilanswer
 

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...

n°1045089
Sve@r
Posté le 12-04-2005 à 23:18:52  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Communication entre deux programmes sous Linux

 

Sujets relatifs
Quel éditeur sous linux ?Bug dans wxSpinCtrl sous Linux et pas Win !!
[C] linkage pour librairie linuxCommunication entre 2 applications sous Linux ?
Récupéré la liste des programmes lancés ...[linux] Définir variables d'environnement dans Makefile
PostgreSQL/Linux : probleme de création de table [résolu]Communication lente entre Word et VB
[linux 2.4 usb] isochrone implique-t-il thread ? 
Plus de sujets relatifs à : Communication entre deux programmes sous Linux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR