Bonjour,

je voudrais faire un programme avec des files de messages ne language C:

A est la mère de B, et B est la mère de C
A saisit un message, l'envoie à B et affiche ce que lui renvoie C
B recoit le message de A, convertit les minuscules en majuscules, et l'envoie à C
C recoit le message de B, met le message dans un tableau, et renvoie ce tableau à A
(pour l'instant il n'y a q'un message, mais apres je vais essayer de faire avec plusieurs messages d'où le tableau)

mon problème, c'est qu'aucun message n'arrive en B ou en C ???

voilà le code de mon programme,
si vous pouviez me dire ce qui bloque, ce serait sympa:


A:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>
#include<errno.h>
#include <sys/ipc.h>
#include<sys/msg.h>
 
void erreur(char *mes);
 
int main(void)
{
	typedef struct
	{
		long type;
		char txt[80];
	}MESSAGE;
 
	typedef struct
	{
		long type;
		int ct;
		char text[10][80];
	}TABLEAU;
 
	int pidb, msqid, ret, ret2;
	MESSAGE mes;
	TABLEAU tab;
 
	//creation de la fille B
	pidb=fork();
	if (pidb==0)
		execv("B",NULL);
 
	//creation de la file de message
	key_t cle;
	cle=ftok("fich",'1');
	msqid=msgget(cle,IPC_CREAT|0666);
	if (msqid==-1)
		erreur("ds A:pb de segment");
 
	//saisie des messages
	printf("taper le message\n");
	scanf("%s",mes.txt);
 
	//A n°1 ,B n°2, C n°3
	//on affecte ce numero dans long type afin que seul le destinataire lise le message
	mes.type=1;
 
	//envoi du message
	ret=msgsnd(msqid,&mes,sizeof(mes),0);
	if (ret==-1)
		erreur("ds A:pb d'envoi");
 
	printf("le message envoye est: %s\n",mes.txt);
 
	usleep(500);
 
	//reception du message de C
	ret2=msgrcv(msqid,&tab.text,sizeof(tab),1,0);
	if (ret2==-1)
		erreur("ds A: pb de reception");
 
	printf("ds A: le message est %s\n",tab.text[0]);	
 
	return 0;
}
 
 
void erreur(char *mes)
{
	perror(mes);
	exit(-1);
}


B

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>
#include<errno.h>
#include <sys/ipc.h>
#include<sys/msg.h>
 
void erreur(char *mes);
 
int main(void)
{
	typedef struct
	{
		long type;
		char txt[80];
	}MESSAGE;
 
	int pidc, msqid, ret;
	int i=0;
	MESSAGE mes;
 
	//creation de la fille C
	pidc=fork();
	if (pidc==0)
		execv("C",NULL);
 
	//ouverture de la file de message
	key_t cle;
	cle=ftok("fich",'1');
	msqid=msgget(cle,0);
	if (msqid==-1)
		erreur("ds B:pb de segment");
 
	//reception du message de A
	ret=msgrcv(msqid,&mes,sizeof(mes),2,0);
	if (ret==-1)
		erreur("ds B: pb de reception");
 
	printf("ds B:le message recu est %s\n",mes.txt);
	usleep(500);
 
	//transformation des minuscules en majuscules
	while(mes.txt[i]!='\0')
	{
		if (mes.txt[i]>='a' && mes.txt[i]<='z')
			mes.txt[i]=mes.txt[i]+'A'-'a';
		i++;	
	}
 
	//A n°1 ,B n°2, C n°3
	//on affecte ce numero dans long type afin que seul le destinataire lise le message
	mes.type=3;
 
	//envoi du message a C
	ret=msgsnd(msqid,&mes,sizeof(mes),0);
	if (ret==-1)
		erreur("ds B: pb d'envoi");
 
	printf("ds B:le message est %s\n",mes.txt);
 
	return 0;
}
 
 
void erreur(char *mes)
{
	perror(mes);
	exit(-1);
}

C

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>
#include<errno.h>
#include <sys/ipc.h>
#include<sys/msg.h>
 
void erreur(char *mes);
 
int main(void)
{
	typedef struct
	{
		long type;
		char txt[80];
	}MESSAGE;
 
	typedef struct
	{
		long type;
		int ct;
		char text[10][80];
	}TABLEAU;
 
	int pidb, msqid, ret, ret2;
	MESSAGE mes;
	TABLEAU tab;
 
	//creation de la file de message
	key_t cle;
	cle=ftok("fich",'1');
	msqid=msgget(cle,0);
	if (msqid==-1)
		erreur("ds C:pb de segment");
 
 
 
	//reception du message de B
	ret=msgrcv(msqid,&tab.text,sizeof(mes),3,0);
	if (ret==-1)
		erreur("ds C:pb de reception");
 
	printf("ds C:le message est %s\n",tab.text[0]);	
 
	usleep(500);
 
	//A n°1 ,B n°2, C n°3
	//on affecte ce numero dans long type afin que seul le destinataire lise le message
	tab.type=0;
 
	//envoi du message a A
	ret2=msgsnd(msqid,&tab.text,sizeof(tab),0);
	if (ret2==-1)
		erreur("ds C: pb d'envoi");
 
	return 0;
}
 
 
void erreur(char *mes)
{
	perror(mes);
	exit(-1);
}
merci d'avance si vous avez lu ces longs programmes