Bonjour, j'ai un TP à réaliser pour lequel je m'arrache les cheveux....
L'objectif est créer 2 équipes composées d'un processus père et de 5 sous processus. Chaque sous processus doit écrire dans un fichier son PID en binaire, et son PPID. les fichiers sont numérotés de 0000 a 9999. Le processus père envoie aux sous processus le numéro de fichier a conquérir. Le processus pere est soumis à une tempo de 20s.
En outre, si un processus de l'autre équipe ouvre un fichier deja conquis par l'autre équipe, il récupère le pid de l'adversaire et le tue via SIG_QUIT.
Enfin, un programme qui compte les points par équipe devra etre mis à disposition....
Voila mon début de code (j'ai honte de le dire, mais j'y ai déjà passé une semaine entière....)
Je crois que seul le premier n° de fichier est récupérer par le sous processus ?
D'autre part, je n'ai pas la moindre idée de comment installer le programme qui compte les points par équipe...
Merci de votre aide, mon exam arrive et je n'ai pas encore pu commencer les révisions tant que je n'ai pas fini ça....et ce n'est pas faute de ne pas bosser !
Code c : 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <signal.h>
 
void pere1();
void pere2();
void fils1();
void fils2();
int randomSel();
void verif();
int rand_a_b();
 
//creation des tubes en lecture et en ecriture - 1 pour chaque equipe
int pip1[2], pip2[2];
char buff[5];
 
// variables pour la sélection aléatoire des fichiers :
int nb_arrivee=0;
int min = 0000;
int max = 8001;
 
 
int main()
{
 
// les processus (pg1 sous processus pa1.1 a 5 et processus pg2 avec sous processus pa2.1 a 5)
pid_t pg1,pg2, pa11, pa12, pa13, pa14, pa15, pa21, pa22, pa23, pa24, pa25; 
 
// variables pour récupérer nb de points
int w11, w12, w13, w14, w15, w21, w22, w23, w24, w25;
int r11, r12, r13, r14, r15, r21, r22, r23, r24, r25;
 
 
// creation du premier processus general - equipe 1
pg1=fork();
 
 
if (pg1==0) {
 
// creation pipe a partager entre pg1 et ses 5 sous processus
// signale erreur si pb à la création d'un pipe
	if(pipe(pip1) == -1)
	{
		perror("Erreur à la création du tube de communication 1.");
		exit(-1);
	}
 
// création des 5 sous processus - equipe 1
pa11=fork();
pa12=fork();
pa13=fork();
pa14=fork();
pa15=fork();
 
//appelle les fonctions selon type de processus
	switch(fork())
	{
		case -1 :
			perror("Erreur lors de la création du fils.");
			exit(-1);
		case 0 :
			fils1();
			break;
		default :
			pere1();
			break;
	}
	return(0);
 
}
 
 
//creation du deuxième processus general - equipe 2
pg2=fork();
 
if (pg2==0) {
 
// creation pipe a partager entre pg2 et ses 5 sous processus
// signale erreur si pb à la création d'un pipe
	if(pipe(pip2) == -1)
	{
		perror("Erreur à la création du tube de communication 3.");
		exit(-1);
	}
// création des 5 sous processus - equipe 2
pa21=fork();
pa22=fork();
pa23=fork();
pa24=fork();
pa25=fork();
 
 
 
//appelle les fonctions selon type de processus
	switch(fork())
	{
		case -1 :
			perror("Erreur lors de la création du fils.");
			exit(-1);
		case 0 :
			fils2();
			break;
		default :
			pere2();
			break;
	}
	return(0);
exit(0);
}
 
}// fin main
 
// equipe 1
void pere1(){
 
	// mise en place du timing
	//alarm(20);
	//while(20) {
	// sélection des fichiers
int i;
	for (i=0; i<4; i++) {
	rand_a_b(min, max);
char buff2 [4];
	// transforme le résultat en string
	sprintf(buff2, "%d", nb_arrivee);
	// ecriture et transmission des n° de fichiers via un pipe
	close(pip1[0]);
	printf("[Père :]Ecriture dans le tube de communication 1.\n");
	if(write(pip1[1],  buff2, 4) > 4)
	{
		perror("Erreur lors de l'écriture dans le tube de communication 1.");
		exit(-1);
	}
	wait(NULL);
	close(pip1[1]);
	}
	}
 
void fils1(){
while(1) {
	// verifie si il a recut un signal SIG_QUIT
	signal(SIGQUIT, verif);
	//lit le n° de fichier 
	int car_lu;
	close(pip1[1]);
	printf("[Fils :]Attente de lecture\n");
	car_lu=read(pip1[0], buff, 4);
	printf("[Fils :]Contenu de la lecture : %s\n",buff);
	close(pip1[0]);
	// ajoute 
	// ecrit
	exit(0);
	}}
 
// equipe 2
void pere2(){
 
	// mise en place du timing
	//alarm(20);
	//while(20) {
int j;
for (j=0; j<4; j++) {
	// sélection des fichiers
	rand_a_b(min, max);
	char buff2 [4];
	sprintf(buff2, "%d", nb_arrivee);
	// ecriture et transmission des n° de fichiers via un pipe
	close(pip2[0]);
	printf("[Père :]Ecriture dans le tube de communication 2.\n");
	if(write(pip2[1], buff2, 4) > 4)
	{
	perror("Erreur lors de l'écriture dans le tube de communication 2.");
		exit(-1);
	}
 
	wait(NULL);
	close(pip2[1]);
	}
	}
 
void fils2(){
 
while(1) {
	// verifie si il a recut un signal SIG_QUIT
	signal(SIGQUIT, verif);
	//lit le n° de fichier 
	int car_lu;
	close(pip2[1]);
	printf("[Fils :]Attente de lecture\n");
	car_lu=read(pip2[0], buff, 4);
	printf("[Fils :]Contenu de la lecture : %s\n",buff);
	close(pip2[0]);
	exit(0);
}
	}
 
void verif(int num_sig) {
	if (num_sig==3) {
		printf("je suis le processus %d et je suis mort", getpid());
		exit(1);	
			}
	// réarme pour qu'unix ne repositionne pas le traitement par défaut
	signal(num_sig, verif);
	}
 
 
int rand_a_b(int min, int max){
	nb_arrivee = rand()%(max-min)+min+1999;
printf("nb d'arrivee %d : nb de depart %d : ", nb_arrivee , nb_arrivee-1999);
	return (nb_arrivee);
 
	}