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

C Discussion :

Tableau en mémoire partagée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut Tableau en mémoire partagée
    Bonjour à tous,
    Voici mon problème, je suis en train de m'exercer sur les mémoire partagées en C. Je souhaite partagée la mémoire entre un processus père et son fils. Dans mon code qui suit je parvient à partager correctement une zone de mémoire entre les deux processus. Par contre je voudrais maintenant partager un tableau de structures qui serait déclarer dans mon pere et qui serait accessible par le fils. Mais je ne vois vraiment pas comment je peux passer en argument ce tableau pour qu'il soit partager. Par exemple ou elevators tab[] serait un tableau de structures elevators correctement initialisé.
    Merci d'avance pour votre aide

    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
     
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <sys/types.h> 
    #include <sys/ipc.h> 
    #include <sys/shm.h>
     
    #define KEY 0x00012347
     
    int main(void){
        int *zone; 
        int memid; 
     
        /* création ou lien avec une zone partagée */
        memid = shmget(KEY, 100, 0700 | IPC_CREAT); 
        if (memid == -1) { 
                               perror("shmget"); return (EXIT_FAILURE); 
        }
     
        /* montage en mémoire */
        zone = shmat(memid, NULL, 0);
     
        /* utilisation */
        zone[0]=34;
        printf("zone[0] = %d\n", zone[0]++ );
     
        pid_t pid;
        pid = fork();
     
        if (pid<0){
    		printf("fork failed\n");
    		return;
        }
     
        if (pid==0){
    		printf("zone[0] = %d\n", zone[0]++ );
    		return (EXIT_SUCCESS); 
        }
    }

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Je n'ai jamais touché à ces fonctionnalités, mais faut voir de quoi est constitué ton tableau. Si les elements ne contiennent que des données scalaires (ex, des int, des flottants, des caracteres, des tableaux de tailles fixes de scalaires, d'autres structures de scalaires), ça serait assez simple, suffirait de stoquer le tableau entier et son nombre d'elements dans des données séparées.
    Sinon, si tes structures contiennent des pointeurs, faudrait surement faire de la "serialization", c'est à dire mettre toutes les données (et les données pointées) dans une seule et meme zone memoire (voir une chaine de caractère unique).

    Sinon, ya la technique des pipes, qui est particulièrement indiquée pour la communication entre pere et fils.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jchenoy Voir le message
    Bonjour à tous,
    Voici mon problème, je suis en train de m'exercer sur les mémoire partagées en C. Je souhaite partagée la mémoire entre un processus père et son fils. Dans mon code qui suit je parvient à partager correctement une zone de mémoire entre les deux processus. Par contre je voudrais maintenant partager un tableau de structures qui serait déclarer dans mon pere et qui serait accessible par le fils. Mais je ne vois vraiment pas comment je peux passer en argument ce tableau pour qu'il soit partager. Par exemple ou elevators tab[] serait un tableau de structures elevators correctement initialisé.
    Merci d'avance pour votre aide

    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
     
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <sys/types.h> 
    #include <sys/ipc.h> 
    #include <sys/shm.h>
     
    #define KEY 0x00012347
     
    int main(void){
        int *zone; 
        int memid; 
     
        /* création ou lien avec une zone partagée */
        memid = shmget(KEY, 100, 0700 | IPC_CREAT); 
        if (memid == -1) { 
                               perror("shmget"); return (EXIT_FAILURE); 
        }
     
        /* montage en mémoire */
        zone = shmat(memid, NULL, 0);
     
        /* utilisation */
        zone[0]=34;
        printf("zone[0] = %d\n", zone[0]++ );
     
        pid_t pid;
        pid = fork();
     
        if (pid<0){
    		printf("fork failed\n");
    		return;
        }
     
        if (pid==0){
    		printf("zone[0] = %d\n", zone[0]++ );
    		return (EXIT_SUCCESS); 
        }
    }
    La mémoire partagée (shm) se comporte comme un gros tableau de char. Rien ne t'empêche de mapper une structure dans ce tableau de char à coup de memcpy()
    Donc tu travailles avec tes structures dans ton code mais quand tu veux les faire passer à ton fils, tu fais un "memcpy(zone, &structure, sizeof structure)"
    Ton fils, lui, récupère le contenu de la structure par le procédé inverse "memcpy(&structure, zone, sizeof structure)". Mais prend en compte les remarques de Gruik (si ta structure contient des pointeurs tu ne mappera que les pointeurs et non les pointés et de l'autre coté tu récupèreras des pointeurs invalides => phénomène de "shadow copy" bien connu des prog C++)

    Sinon t'as d'autres outils disponibles, notemment les msq que tu peux associer directement aux éléments de ton code et qui possèdent un mini ordonnanceur de priorités.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Par défaut
    Merci beaucoup pour vos conseils.
    En effet, étant débutant, je n'avais pas penser au problème des pointeurs dans la mémoire partagée.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jchenoy Voir le message
    Merci beaucoup pour vos conseils.
    En effet, étant débutant, je n'avais pas penser au problème des pointeurs dans la mémoire partagée.
    C'est un problème qui dérive de ceux qu'on trouve quand on copie mal une chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        char orig[]="Hello";             // Une chaîne
        char *copie;                     // Une copie
     
        copie=orig;                       // On ne copie que le pointeur et non le pointé
     
        orig[0]='f';                    // On modifie le pointé
     
        printf("%s\n", copie);         // => fello => Même avec 2 pointeurs, on n'a qu'un seul pointé
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut
    héhé, ça sent le projet d'OS de Bonaventure, ça !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau de mémoire partagée
    Par sikin1989 dans le forum Débuter
    Réponses: 8
    Dernier message: 04/12/2010, 17h16
  2. Réponses: 0
    Dernier message: 24/03/2010, 18h18
  3. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  4. création d'objet en mémoire partagé
    Par BigNic dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2005, 18h41
  5. [CR][paradox] mémoire partagée disponible insuffisante !
    Par AGT dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/03/2004, 14h27

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