Voici le sujet d'un exo qui porte sur les sémaphores et qui me pose quelques difficultés (j'ai dû chercher pendant bien 5h et j'ai toujours pas trouver le bon code source). Pouvez vous me donner un petit coup de pouce ? Merci d'avance
On veut simuler la traversée d’un carrefour routier. Le carrefour est divisé en quatre quadrants. A un instant donné, une voiture peut :
être en attente à l’une des entrées du carrefour
être engagée dans l’un des 4 quadrants
poursuivre sa route vers le nord, le sud, l’est ou l’ouest

Une voiture peut effectuer 3 types de parcours, quelle que soit sa direction d’arrivée :
type 1 : tourner à droite en traversant un seul quadrant
type 2 : aller tout droit en traversant deux quadrants
type 3 : tourner à gauche en respectant la priorité et en traversant 3 quadrants

Chaque quadrant est une ressource à partager de façon exclusive entre tous les processus voiture.

On supposera qu’il ne peut y avoir plus de 3 voitures dans le carrefour pour éviter l’interblocage, en positionnant un sens interdit

Simuler le fonctionnement du carrefour en utilisant des sémaphores (étude de principe, explication des choix et des algorithmes, réalisation)


Voici jusqu'où je suis arrivé (NB : c'est pas codé très proprement ) :
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
 
#include "sema.h"
#include <stdio.h>
#include <stdlib.h>
 
#define NB_VOITMAX 3
#define NB_SEM 4
 
 
int Random (int _iMin, int _iMax)
{
    return (_iMin + (rand () % (_iMax-_iMin+1)));
}
 
void traversee1(int *tabSem,int i) //Le véhicule i tourne à droite
{
    printf("Le vehicule provenant de %d ",i);
    printf("est engage dans le quadrant %d \n",i);
    sleep(Random(1,10));
    P(tabSem[i]);
    printf("Le vehicule provenant de %d a termine de tourner et poursuit sa route \n",i);
    exit(0);
}
void traversee2(int *tabSem,int i, int j) //Le véhicule va tout droit de i à j
{
    printf("Le vehicule provenant de %d ",i);
    printf("est engage dans le quadrant %d \n",i);
    sleep(5);
    P(tabSem[i]);
    printf("Le vehicule provenant de %d ",i);
    printf("quitte le quadrant %d \n",i);
 
    sleep(2);
 
    if (fork()==0)
    {
            V(tabSem[j]);
            printf("Le vehicule provenant de %d ",i);
            printf("est engage dans le quadrant %d \n",j);
            sleep(4);
            P(tabSem[j]);
            printf("Le vehicule provenant de %d a termine de tourner et poursuit sa route \n",i);
 
    }
    exit(0);
}
void traversee3(int *tabSem,int i, int j, int k) //Le véhicule tourne à gauche en respectant la priorité
{
    printf("Le vehicule provenant de %d ",i);
    printf(" est engage dans le quadrant %d \n",i);
    sleep(Random(1,2));
    printf("Le vehicule provenant de %d ",i);
    printf("quitte le quadrant %d \n",i);
    P(tabSem[i]);
 
    if (fork()==0)
    {    
        V(tabSem[j]);
        printf("Le vehicule provenant de %d ",i);
        printf(" est engage dans le quadrant %d \n",j);
        sleep(Random(1,5));
        P(tabSem[j]);
        printf("Le vehicule provenant de %d ",i);
        printf(" quitte le quadrant %d \n",j);
 
        if (fork()==0)
        {
            V(tabSem[k]);
            printf("Le vehicule provenant de %d ",i);
            printf("est engage dans le quadrant %d \n",k);
            sleep(Random(1,5));
            P(tabSem[k]);
 
            printf("Le vehicule provenant de %d a termine de tourner et poursuit sa route \n",i);
 
        }
    }
 
    exit(0);
}
 
void creervoiture(int t)
{
    if (fork()==0)
    {
    V(tabSem[t]);
    printf("Un vehicule arrive et s engage dans le quadrant %d)\n",t);
    exit(0);
    }
}
 
int main(void)
{
    int m,i,j,n;
    int nbvoitc; //Nb voiture se présentant au carrefour
    srand(time(NULL));
    int tabSem[NB_SEM];
    printf("Debut programme \n");
    for (m=0;m<NB_SEM;m++)
    {
        tabSem[m]=sem_create(0);
    }    
    if (fork()==0)
    {
 
            nbvoitc=Random(1,NB_VOITMAX);
            int tabvoit[nbvoitc];
            for (j=0;j<nbvoitc;j++)
            {    
                tabvoit[j]=Random(0,NB_VOITMAX);
                creervoiture(tabvoit[j]);
            }
            printf("Total de voitures dans le carrefour %d \n",nbvoitc);
            for (n=0;n<nbvoitc;n++)
            {    
                int y;
                printf("Voiture %d selectionnee",tabvoit[n]);
                switch(Random(1,3))
                {
                case 1:
                    traversee1(tabSem, tabvoit[n]);
                    break;
                case 2:
                    traversee2(tabSem, tabvoit[n],tabvoit[n]+1);
                    break;
                case 3:
                    if (tabvoit[n]>1)
                    {
                        y=0;
                    }
                    else
                    {
                        y=(tabvoit[n]+2);
                    }
                    traversee3(tabSem, tabvoit[n],tabvoit[n]+1,y);
                break;
                }    
            }
 
    }
 
    exit(0);
}