-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreat.c
127 lines (110 loc) · 2.98 KB
/
creat.c
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
// default libs
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/wait.h>
int nbArrivee = 0;
int sem, memcp, memp;
int main(void)
{
int p, err;
// int n_hackers = atoi(argv[0]);
// int n_windows = atoi(argv[1]);
key_t clef;
/* Création des sémaphores */
clef = ftok("./creat.c", 2);
sem = semget(clef, 5, IPC_CREAT | 0666);
if (sem == -1)
{
printf("\n Erreur de creation des sémaphores");
exit(1);
}
/* Initialisation des sémaphores */
semctl(sem, 0, SETVAL, 1); // mutex
semctl(sem, 1, SETVAL, 0); // windowsque
semctl(sem, 2, SETVAL, 0); // hackerque
semctl(sem, 3, SETVAL, 0); // sembarrier
semctl(sem, 4, SETVAL, 1); // mutex2
/* Création des segments partagés */
// nombre de hackers et windows dans le bateau
clef = ftok("creat.c", 3);
memp = shmget(clef, 3 * sizeof(int), IPC_CREAT | 0666);
if (memp == -1)
{
printf("\n Erreur de creation de la mémoire partagée");
exit(2);
}
// clef = ftok("TP_main.c", 4);
// memcp = shmget(clef, sizeof(int), IPC_CREAT | 0666);
// if (memcp == -1)
// {
// printf("\n Erreur de creation de la mémoire partagée");
// exit(2);
// }
// int nbrArrivee = shmat(memcp, 0, 0);
// nbrArrivee = 0;
/* Attachement */
int *type_win_hack = shmat(memp, 0, 0);
type_win_hack[0] = 0; // nbr windows
type_win_hack[0] = 0; // nbr hackers
type_win_hack[0] = 0; // nbr personnes dans le bateau
/*detachement */
// shmdt(nbrArrivee);
shmdt(type_win_hack);
// creation des processus
int NB_HACKERS = 2;
int NB_WINDOWS = 2;
for (int i = 0; i < NB_HACKERS; i++)
{
p = fork();
if (p < 0)
{
printf("prblm %d", p);
}
if (p == 0)
{
printf("gonna start hacker");
err = execl("./hacker", "Hacker", NULL);
printf("\n Erreur de chargement du programme Hacker N° erreur %d\n", err);
exit(4);
}
}
for (int i = 0; i < NB_WINDOWS; i++)
{
p = fork();
if (p < 0)
{
printf("prblm %d", p);
p = wait(NULL);
while (p != -1)
{
printf("\n Fils terminé %d", p);
p = wait(NULL);
}
}
else if (p == 0)
{
printf("gonna start windows");
err = execl("./windows", "Windows", NULL);
printf("\n Erreur de chargement du programme Windows N° erreur %d\n", err);
exit(4);
}
}
p = wait(NULL);
while (p != -1)
{
// printf("\n Fils terminé %d", p);
p = wait(NULL);
}
semctl(sem, IPC_RMID, 0);
shmctl(memp, IPC_RMID, 0);
shmctl(memcp, IPC_RMID, 0);
return 0;
}