IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

tableau commun à tous les fork() via un pipe & un pointeur


Sujet :

POSIX C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 32
    Points
    32
    Par défaut 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 : 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

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 21
    Points
    21
    Par défaut
    tu devrais regarder les docs sur les IPCs (Communication Inter-Processus) et les shm (memoire partage) pour faire ton projet.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 41
    Points : 32
    Points
    32
    Par défaut
    ps: post à partir du compte d'une collège, en attendant que le mien soit activé.
    --------------------------------------------------------------------------------



    Merci, mais dois-je en conclure que ma démarche ne fonctionnera jamais?
    Car si elle peut fonctionner, cela m'intéresse plus que d'avoir recours à IPC & shm...

    VikariuS

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Bonjour,

    Il faut utiliser un sémaphore et un segment de mémoire partagée. C'est assez complexe. Je te poste un exemple de code dès que possible.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    disons qu'avec ce choix d'architecture tu te bloques a fonctionner sur une seule machine.....

    Ce que je choisrais, c'est de definir un message pour chaque fork/chaque mort, et que ce message soit dispatche par le pere, et que chaque fils mettent a jour sa liste en fonction des messages...

    A chaque nouveau fork, le pere envoie au nouvel enfant la liste des enfants avant lui. A chaque nouvelle mort, le pere dispatch aux enfants restant la mort.

    L'avantage est que les peres/fils ne sont pas lies a une seule machine : un fils peut etre sur une autre machine, et etre lui-meme le pere d'une nouvelle serie...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En fait, ce choix est volontairement destiné à fonctionner sur une seule machine. Donc, même si elle est très intéressante, l'architecture que tu me proposes complexifie ma problématique inutilement

    Okai Neuromancien2, un exemple de squelette ne serait effectivement pas de refus étant donné cette approche assez délicate en soit

    En attendant, je me documente sur le sujet

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Concernant l'architecture initiale, celle-ci est bel et bien irréalisable compte tenu du principe de fonctionnement de linux (les données en mémoire d'un processus ne peuvent être partagées via des pointeurs).

    Sinon, je planche toujours sur le sujet...

Discussions similaires

  1. [Débutant] Bibliothèque commune à tous les projets
    Par genamiga dans le forum NetBeans
    Réponses: 2
    Dernier message: 07/01/2008, 10h43
  2. fichier commun à tous les systèmes Linux
    Par Shugo78 dans le forum Administration système
    Réponses: 11
    Dernier message: 13/06/2007, 21h51
  3. Wallpaper Fond d'ecran commun à tous les utilisateurs
    Par krey26 dans le forum Windows XP
    Réponses: 2
    Dernier message: 17/05/2007, 19h56
  4. Constante commune à tous les modules du projet
    Par Mors_Ubyte dans le forum Access
    Réponses: 1
    Dernier message: 19/07/2006, 14h48
  5. [MySQL] 1 seul tableau pour tous les résultats de requetes
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/05/2006, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo