Bonjour,
J'ai un pb similaire en ce qui concerne les sémaphores et files de messages.
Je m'explique je simule un aéroport. J'ai donc créé des processus avions qui une fois à une certaine distance envoie une file de messages à la tour. Bien sur comme plusieurs avions peuvent arriver en même temps j'ai mis une sémaphore(de type Mutex) pour ne pas que plusieurs avion accède simultanément à la tour. Une fois que la tour à reçu le message des indications de l'avions elle transmet les info à un des 3 contrôleurs en prenant le premier qui est libre. Ceux ci étant également régis par des sémaphores. Une fois le controleur choisi, celui-ci renvoie ces info et surtout le code de ces sémaphores pour pouvoir directement communiqué avec l'avion à la tour.La tour elle relaye à l'avion qui recontacte directement le contrôleur. Une fois cela fait le controleur réservera unue piste et un emplacement de tarmac entre temps,bien sur, la sémaphore de l'accés à la tour est libérée et et on recommence.

Mon problème et que les sémaphores marche très bien et les files de messages aussi(enfin je suppose) cependant quand je combine les 2 tout plante.
Je vous join le code est ce que vous pourriez me dire ce qui cloche?

Varible globales avion.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
appareil avion;
int msgidAVION,controle_creation;
Messages_avion msg;
Message_controleur msgC;
int tailleMsg= sizeof(msg),tailleMsgC=sizeof(msgC)-sizeof(int);
Code de l'avion
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
 
if((controle_creation=semget(Cle_sema,nb_Sem, 0))==-1){printf("Probleme lors de la creation des semaphores-avion.c.\n");exit(1);}
	//l'avion est en approche
 
	if((msgidAVION=msgget(cle_message_avion, 0))==-1){
		printf("Probleme lors de la creation des files de messages.-avion.c\n");exit(1);}
 
//l'avion veut réservé un emplacement pendant ce temps on suppose qu'il ne consomme pas ou peu de carburant
	printf("Contacte avec la tour.\n");
	//semaphore pour la tour. Il demande à la tour un controleur.Celle ci lui repond en lui passant un pid du controleur libre.
	printf("Je demande à la tour de m'accepter.Moi %d\n",getpid());
	P(0);
	printf("Je suis passe au dela de la semaphore.Moi %d\n",getpid());	
 
	msg.type=6;
	msg.id=getpid();
	msg.urgence=avion.urgence;
 
	//Envoie des caractérisitques de l'avion a la tour
	if(msgsnd(msgidAVION,&msg,tailleMsg,MSG_NOERROR)!=-1)
		printf("Le message a bien ete envoye.Je lui envoie (%d, %d, %d).\n",msg.type,msg.id,msg.urgence);
	else
		printf("Erreur transmission,avion\t%d\n",getpid());
 
	//On passe la main a la tour
 
	V(1);
 
	P(4);
 
	//Reception du message de la tour qui donne le numero d'entree et de sortie de semaphore.
 
	printf("L'avion est pris en main par le controleur.\n");
 
	//L'avion communique avec le controleur.Celui-ci lui envoie le pid d'une piste et d'un tarmac.Ainsi que son numero de semaphore
 
	//Semaphore du controleur reçu par fils de message.Numero de sortie
	//Reception message
	if(msgrcv(msgidAVION, &msgC, tailleMsgC,msgC.id, 0) != -1)
		printf("J'ai bien reçu le message du controleur %d avec sa cle %d et ces semaphores (%d,%d). Moi la tour.\n",msgC.id,msgC.cle,msgC.num_sem_entree,msgC.num_sem_sortie);
	else
		printf("Erreur reception tour\t%d\n",getpid());
 
	V(msgC.num_sem_entree);
	P(msgC.num_sem_sortie);
 
 
	//Une fois celle ci reçu OK.Une fois au tarmac ravitaillement.Puis soit reste au tarmac soit repars.
 
	printf("L'avion quitte l aeroport.\n");
	avion_aeroport--;
	msgctl(msgidAVION,IPC_RMID,NULL);
	kill(getpid(),SIGKILL);
 
	return 0;
Code de la tour
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
 
while(1){
				//la tour va recevoir un message elle se debloque
				P(1);
 
				if(msgrcv(msgidAVION, &msgA, tailleMsgA,msgA.type, 0) != -1)
					printf("J'ai bien reçu le message de l'avion %d en etat d'urgence %d. Moi la tour.\n",msgA.id,msgA.urgence);
				else
					printf("Erreur reception tour\t%d\n",getpid());
 
				printf("La tour a bien reçu votre message.\n");
				sleep(2);
				printf("Recherche de controleur.\n");
				//envoie d'un message a un contrleur dispo.
 
				if(msgsnd(msgidAVION,&msgA,tailleMsgA,MSG_NOERROR)!=-1)
					printf("Le message a bien ete envoye.Je lui envoie (%d, %d).\n",msgA.id,msgA.urgence);
				else
					printf("Erreur transmission,tour\t%d\n",getpid());
 
				//on passe la main au controleur
				V(2);
				P(3);
				if(msgrcv(msgidAVION, &msgC, tailleMsgC,msgC.id, 0) != -1)
					printf("J'ai bien reçu le message du controleur %d avec sa cle %d et ces semaphores (%d,%d). Moi la tour.\n",msgC.id,msgC.cle,msgC.num_sem_entree,msgC.num_sem_sortie);
				else
					printf("Erreur reception tour\t%d\n",getpid());
 
				if(msgsnd(msgidAVION,&msgC,tailleMsgC,MSG_NOERROR)!=-1)
					printf("Le message a bien ete envoye.");
				else
					printf("Erreur transmission,tour\t%d\n",getpid());
				V(4);
				//Envoie à l'avion
 
				//la tour transmet à l'avion demandeur les semaphores du controleur
 
			}
Code du controleur

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
 
if((controle_creation=semget(Cle_sema,nb_Sem, 0))==-1){printf("Probleme lors de la creation des semaphores-controleur.c.\n");exit(1);}
 
	if((msgidAVION=msgget(cle_message_avion, 0))==-1){
		printf("Probleme lors de la creation des files de messages.-tour.c\n");exit(1);}
 
	printf("Controleur...OK.\t %d.\n",getpid());
	while(1){
 
		P(2);
		if(msgrcv(msgidAVION, &msgA, tailleMsgA,msgA.type, 0) != -1)
			printf("J'ai bien reçu le message de l'avion %d en etat d'urgence %d, moi le controleur %d\n",msgA.id,msgA.urgence,getpid());
		else
			printf("Erreur reception controleur\t%d\n",getpid());
		//Le controleur dis a la tour qu'il prend bien son numero de semaphore 
		//cette securite est mise en place pour ne pas qu'un contrleur libere un avion dont il ne s'occupe pas
		msgC=mise_a_jour_etat(frequence);//peut etre inutil-en discuter avec le prof
		printf("Coucou je suis le controleur %d et je suis %d\t.\n",getpid(),frequence[id].etat);
 
		if(msgsnd(msgidAVION,&msgC,tailleMsgC,MSG_NOERROR)!=-1)
			printf("Le message a bien ete envoye.Je lui envoie (%d,%d,%d, %d).\n",msgC.id,msgC.cle,msgC.num_sem_entree,msgC.num_sem_sortie);
		else
			printf("Erreur transmission,controleur\t%d\n",getpid());
 
		V(3);
		P(msgC.num_sem_entree);
 
		V(0);
		sleep(2);
		printf("Hmm la tache est faite.\n");
		V(msgC.num_sem_sortie);
		//libere_etat(frequence);
		//printf("Coucou je suis le controleur %d et je suis %d\t.\n",getpid(),frequence[id].etat);
		//creer un numero special du controleur pour etre sur de synchroniser le bonne avion avec le bon controleur
	}