Bonjour;
Dans le cadre d'un projet, je suis amené à faire communiqué deux applications à l'aide de file de message. Avant de complexifier le programme pour l'adapter aux réels besoin, j'aimerai simplement faire :
- Le premier programme dépose un message dans la liste
- Le second boucle infini est affiche les message au fur et à mesure de leurs arrivés sur cette même file.
Pourtant impossible de faire quelque chose qui marche. Les exemples sur Internet ne sont pas légion et ceux que j'ai trouvé n'étaient pas très complet voir ne fonctionnaient pas...
Voici les sources du programme "serveur" qui récupère les messages :
Les sources du programme client, censé envoyé les messages
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 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> typedef struct T{ long mtype; char mtext[1000]; }Tampon; int main(int argc, char * argv[]) { //Création de la clef key_t clef = ftok("/home/gautier/file", 'a'); //Demande d'accès à la file de message int id = msgget(clef, 0666 | IPC_CREAT); //En cas d'erreur if(id == -1) { fprintf(stderr, "(%s) %d. Accès impossible à la file de message.\n", __FILE__, __LINE__); exit(EXIT_FAILURE); } printf("clef : %d\n", id); //Boucle principale while(1) { Tampon message; int rcv = msgrcv(id, (struct msgbuf *) &message, M_TMAX, 0L, 0); printf("%d ok", rcv); } //Fin "propre" return EXIT_SUCCESS; }
Le premier programme écrit le clef et attend indéfiniment.
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 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> typedef struct T{ long mtype; char mtext[1000]; }Tampon; int main(int argc, char * argv[]) { //Création de la clef key_t clef = ftok("/home/gautier/file", 'b'); //Demande d'accès à la file de message int id = msgget(clef, 0666); //En cas d'erreur if(id == -1) { fprintf(stderr, "(%s) %d. Accès impossible à la file de message.\n", __FILE__, __LINE__F); exit(EXIT_FAILURE); } printf("clef : %d\n", id); while (1) { struct T msg; int l, r; printf("> "); fgets(msg.mtext, M_TMAX, stdin); l = strlen(msg.mtext); msg.mtype = 1; r = msgsnd(id, (struct msgbuf *) &msg, l + 1, 0); if (r == -1) perror("msgsnd"); } //Fin "propre" return EXIT_SUCCESS; }
Le second se comporte sans erreur
La commande "ipcs -a" lancé dans un troisième terminal montre bien la nouvelle file créée mais celle ci ne se remplit pas...
Voilà donc je suis preneur de toute correction ou de tout exemple que vous pourriez me fournir, merci d'avance.
Partager