Communication entre deux programmes sous Linux - C - Programmation
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
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.
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 , sinon j'aimagien meme pas la taille des buffers necessaires parfois .
Les tubes nommés c'est assez simple a utiliser
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 )
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 |
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. |
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
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
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
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...
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é
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.
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 :
|
dans le prog2
Code :
|
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...
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...
|
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); |
!!!
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