Pages : 1
#1 Le 07/01/2008, à 20:59
- jerepain
[C] Tubes entre 2 processus
Bonjour,
J'essaie tant bien que mal de faire communiquer 2 processus entre eux en C par le biais d'une fifo (c'est la première fois que je fais ça). J'envoie une info à partir d'un terminal, et un autre terminal la récupère. Seulement lorsque j'envoie une 2ème info (chaine de caractères) celà ne fonctionne plus :'(
Vous avez une idée ?
#2 Le 07/01/2008, à 22:10
- best_friend_fr
Re : [C] Tubes entre 2 processus
Salut
Peux tu poster ton code?
Pour communiquer entre 2 process, il faut un pipe dans le cas ou tes 2 process sont parents, ou un fichier dans le cas contraire.
Tu peux egalement utiliser les signaux (programmation avancee).
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#3 Le 08/01/2008, à 19:51
- jerepain
Re : [C] Tubes entre 2 processus
Mes processus ne sont pas parents : je lance chaque process sur un terminal différent. Je passe donc par une fifo via mkfifo, mais je te laisse apprécier mon code :
D'abord le client (terminal qui devrait recevoir la bonne chaine de caractère mais qui reçoit toujours la même :
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char envoi, reception2[300], envoi3;
int Descripteur1, Descripteur2, Result, c;
Descripteur1=open("fifocs",O_WRONLY);
mkfifo("fifosc", 0644);
while(c != 1)
{
printf("\n\t---MENU---\n");
printf("\n1 : Quitter");
printf("\n2 : Opération la plus effectuée");
printf("\n3 : Nombre de fichiers doublons");
printf("\n\nSaisir le choix : ");
scanf("%d", &c);
Descripteur2=open("fifosc", O_RDONLY|O_NONBLOCK);
switch(c)
{
case 2 :
envoi='a';
break;
case 3 :
envoi='b';
break;
}
write (Descripteur1, &envoi, sizeof(char));
sleep(1);
Result=read(Descripteur2, reception2, 300*sizeof(char));
printf("\n%s\n\n", reception2);
envoi3='x';
sleep(1);
write(Descripteur1, &envoi3, sizeof(char));
memset (reception2, 0, sizeof (reception2));
}
return 0;
}
Maintenant le serveur (processus lancé en premier qui reçoit une requête du client pour ensuite lui renvoyer l'info qu'il demande) :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define TAILLE 10
int main ()
{
char reception, envoi2[300], reception3='r';
int Descripteur1, Descripteur2, R;
int Result;
FILE *f;
while(1)
{
reception='r';
mkfifo("fifocs", 0644);
Descripteur1=open("fifocs",O_RDONLY|O_NONBLOCK);
while(reception == 'r')
{
Result=read(Descripteur1, &reception, sizeof(char));
}
if(reception == 'a')
{
Descripteur2=open("fifosc", O_WRONLY);
f=fopen("junix/journaux/operation_effectuee","r");
fread(envoi2, sizeof(char), 300, f);
printf("Envoi2 vaut %s \n",envoi2);
while(reception3 != 'x')
{
R=write(Descripteur2, envoi2, 300*sizeof(char));
//if (R>=0) printf("youpi a\n"); else printf("rhoooo a\n");
read(Descripteur1, &reception3, sizeof(char));
sleep(1);
//if (reception3 == 'x') printf("reception3 vaut %c",reception3); else printf("méeuuh");
}
memset (envoi2, 0, sizeof (envoi2));
}
if(reception == 'b')
{
Descripteur2=open("fifosc", O_WRONLY);
f=fopen("junix/journaux/redondance","r");
fread(envoi2, sizeof(char), 300, f);
printf("Envoi2 vaut %s \n",envoi2);
while(reception3 != 'x')
{
R=write(Descripteur2, envoi2, 300*sizeof(char));
//if (R>=0) printf("youpi b\n"); else printf("rhoooo b\n");
read(Descripteur1, &reception3, sizeof(char));
//if (reception3 == 'x') printf("reception3 vaut %c",reception3);
}
memset (envoi2, 0, sizeof (envoi2));
}
}
return 0;
}
#4 Le 08/01/2008, à 20:06
- best_friend_fr
Re : [C] Tubes entre 2 processus
Salut,
Je sais pas si c'est le probleme, mais tu ne peux pas faire 2 scanf comme ca, parce que le deuxieme recevra le caractere "retour a la ligne".
Tu dois d'abord le depiler (par exemple avec un scanf qui ne fait rien, ou un read).
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#5 Le 09/01/2008, à 16:51
- jerepain
Re : [C] Tubes entre 2 processus
Un scanf qui ne fait rien ?J'ai tappé ceci :
scanf(" ");
avant mon scanf, mais ça ne fonctionne toujours pas
#6 Le 09/01/2008, à 16:58
- Coolgeek
Re : [C] Tubes entre 2 processus
pense aussi a fermer ton fichier une fois qu'il a servi. ca pourrais poser des souci.
Hors ligne
#7 Le 09/01/2008, à 19:27
- best_friend_fr
Re : [C] Tubes entre 2 processus
Je dirais plutot un scanf qui lit un caractere sans rien en faire, ou un getc, ou un read sur stdin...
genre, tu peux faire un
scanf("%c", &c);
et ignorer la valeur de c.
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#8 Le 09/01/2008, à 21:18
- pef
Re : [C] Tubes entre 2 processus
Pourquoi ton mkfifo est dans la boucle infinie while ?
Hors ligne
#9 Le 10/01/2008, à 11:37
- Dyrg
Re : [C] Tubes entre 2 processus
Sinon les sockets sont bien adaptées aux communications inter-process, bien qu'elles soient "un peu plus lourdes" à mettre en place.
Hors ligne
#10 Le 10/01/2008, à 12:12
- jerepain
Re : [C] Tubes entre 2 processus
La méthode du scanf ne fonctionne pas.
J'ai mis le mkfifo en dehors et ça ne marche pas non plus.
Je n'ai pas appris à utiliser les sockets, donc c'est même pas la peine d'y penser vu que je dois rendre mon projet demain C'est le dernier problème à corriger, j'ai pas envie de rendre un truc complet à 95%.
C'est le reception2 qui reçoit mal car l envoi2 envoie tuojours la bonne info. Ou alors c'est dans la fifo que ça merde.
Pages : 1