Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm

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