tableau commun à tous les fork() via un pipe & un pointeur
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:
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