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 :

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;
}
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
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 premier programme écrit le clef et attend indéfiniment.

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.