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
merci d'avance si vous avez lu ces longs programmes
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); }
Partager