ps: post à partir du compte d'une collège, en attendant que le mien (Vikarius) soit activé.
-------------------------------------------------------------------------

Bonjour,

Dans le cadre d'un projet en langage c, je peine dans mon choix d'architecture depuis quelques jours déjà...

L'idée:
- un serveur accorde à ses clients la possibilité de communiquer ensemble
- (côté serveur) un tableau de données unique matérialise la communication entre les "fork"
- (côté serveur) le "père" envoi à chaque "fork" un pointeur vers le tableau cité ci-dessus
- (côté serveur) la première entrée du tableau "data[0]" autorise l'écriture pour un "fork" à la fois
(ex: lorsqu'un "fork" désire écrire dans le tableau, il doit attendre que cette entrée
lui donne le feu vert et le cas échéant, un feu rouge y est signalé aux autres "fork" le temps de l'écriture)

La démarche:
- un tableau est déclaré en en-tête du "main"
- le père envoi a ses fils un pointeur sur ce tableau via un "tube"
- les fils récupèrent ce pointeur et procèdent à des traitements sur ce tableau (désormais théoriquement partagé)

La situation:
- les "fork" héritent bien du tableau initial mais les traitements demeurent en leur sein

La problématique:
- obtenir un partage de ce tableau entre les "fork"
- trouver une âme charitable qui voudrait bien éclairer ma lanterne ^_^

L'outil:
- distribution linux Ubuntu (émulation sous xp)
- compilateur gcc

La source (la dernière en date):

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
...
 
char data[1000][2048];
 
int main() {
 
	...
 
	if(pipe(tube)==-1) {
		perror("failed");
	}
 
	...
 
	strcpy(data[0],"test");
 
	...
 
	switch (pid=fork()) {
		case -1: perror("failed");
		case 0: child();
		default: parent();
	}
 
}
 
void child() { // fils
	close(tube[1]);
	if (read(tube[0],&data,2048)<0) {
		write(newsock,"failed",256);
	}
	*pdata = &data;
	close(tube[0]);
	write(newsock,pdata,256); // renvoie "test1" au client
	read(newsock,data[0],256); // réceptionne une saisie du client (exemple "test2")
	write(newsock,data[0],256); // renvoie les données au client (exemple "test2")
 
 
	// après avoir lancé un client qui a renseigné ses données,
        //  "test1" s'affiche chez les nouveaux clients au lieu de par exemple "test2"...
}
 
void parent() { // père
	strcpy(data[0],"test1");
	close(tube[0]);
	write(tube[1];&data,2048);
	close(tube[1]);
 
}
 
...
Si je ne suis pas assez explicite, n'hésitez pas à me le faire remarquer

Merci pour votre attention,

VikariuS