Bonjour,
je veux mettre en place une file de messages entre un processus "émetteur" et plusieurs processus "récepteur". Chaque récepteur étant associé à un type (1, 2, 3 ou 4, etc...) de message particulier.
Pas de pb de réception pour un message de type 0 mais dès que je passe à 1 voire plus, plus de réception.
Le code côté émetteur:
Le code côté récepteur:
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 struct Msgbuf { long mtype; /* message type, must be > 0 */ char mtext[128]; /* message data */ }; int main() { int msgq; //message queue identifier key_t cle; struct Msgbuf msgbuf; char msg[64]; cle = ftok("file_msg", 'Q'); if(cle < 0) { perror("ftok"); exit(EXIT_FAILURE); } msgq = msgget(cle, 0660 | IPC_CREAT); if(msgq < 0) { perror("msgget"); exit(EXIT_FAILURE); } do { printf("Type du message: "); scanf("%d", (int*)&msgbuf.mtype); while(getchar() != '\n'); if((int)msgbuf.mtype < 0) break; printf("Contenu du message: "); scanf("%s", msg); while(getchar() != '\n'); strcpy(msgbuf.mtext, msg); msgsnd(msgq, &msgbuf, sizeof(msgbuf.mtext), 0); printf("Sent %s\n", msgbuf.mtext); }while(1); msgctl(msgq, IPC_RMID, NULL); printf("Bye...\n"); exit(EXIT_SUCCESS); }
J'ai pas mal fureté sur le Net. Je pense être dans les clous mais je ne vois pas ce qui cloche...
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 struct Msgbuf { long mtype; /* message type, must be > 0 */ char mtext[128]; /* message data */ }; /****************************************************************************** * récepteur de message de type 1 * ***************************************************************************/ int main() { int msgq; //message queue identifier key_t cle; struct Msgbuf msgbuf; int nb_octets; long type; cle = ftok("file_msg", 'Q'); if(cle < 0) { perror("ftok"); exit(EXIT_FAILURE); } msgq = msgget(cle, 0660); if(msgq < 0) { perror("msgget"); exit(EXIT_FAILURE); } type = 1; msgbuf.mtype = type; printf("Waiting for message type %d...\n", (int)type); do { nb_octets = 1; nb_octets = msgrcv(msgq, &msgbuf, sizeof(msgbuf.mtext), type, 0); printf("%d type=%d %s\n", nb_octets, (int)msgbuf.mtype, msgbuf.mtext); if(nb_octets < 0) { perror("msgrcv"); break; } }while(msgbuf.mtype >= 0); printf("Fin du lecteur.\n"); exit(EXIT_SUCCESS); }
Merci pour vos conseils.
Partager