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 de l'avion
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 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
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 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
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 : 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 }
Partager