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 :

Passer une structure dans une Shared memory


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut Passer une structure dans une Shared memory
    Bonjour,

    J'ai crée une mémoire partagée entre 2 processus et j'aimerai savoir comment c'est possible de passer la structure ou du moins ces attribut à l'autre processus.

    Dois-je passer l'adresse de la structure et ainsi l'autre processus pourra aller pointer sur les attribut ou dois-je passer l'adresse de chaque attribut ?

    merci de me donner un petit peu d'aide.

    salutations

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    L'autre process ne peut accéder qu'au données présentes dans la shared memory. Si par exemple ta structure ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct {
        char *a;
        char b[50];
    }
    et qu'un objet "s" de ce type est placé en mémoire partagée, alors l'autre processus pourra accéder s.a mais pas à s.a[0], sauf évidemment si s.a est une adresse qui fait partie de la zone partagée. L'autre process pourra aussi accéder à s.b[0], s.b[1], etc.

  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 cyrill.gremaud Voir le message
    Bonjour,

    J'ai crée une mémoire partagée entre 2 processus et j'aimerai savoir comment c'est possible de passer la structure ou du moins ces attribut à l'autre processus.

    Dois-je passer l'adresse de la structure et ainsi l'autre processus pourra aller pointer sur les attribut ou dois-je passer l'adresse de chaque attribut ?

    merci de me donner un petit peu d'aide.

    salutations
    Salut
    Chaque processus possède sa mémoire attitrée. Donc si p1 passe l'adresse d'une variable à p2, p2 recevra bien une adresse mais ne pourra rien en faire (puisque la variable est chez p1).
    Donc si tu dois passer des éléments de p1 à p2 il te faut les copier dans la shm pour que p2 puisse les récupérer.
    Et si tu as beaucoup d'élément à faire passer alors évidemment tu peux les encapsuler dans une structure et claquer directement la structure dans la shm. p2 pourra alors remapper la shm dans une structure équivalente de sa propre zone mémoire.

    Typiquement
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    header.h
    typedef struct {
        int x;
        double y;
        char z[10];
    } t_elem;

    p1.c
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "header.h"
    int main()
    {
        t_elem elem;
        char *shm;
     
        shm=shmat(...);
        elem.x=10;
        elem.y=3.1416;
        strcpy(elem.z, "toto");
     
        memcpy(&elem, shm, sizeof(elem));
    }

    p2.c
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "header.h"
    int main()
    {
        t_elem elem;
        char *shm;
     
        shm=shmat(...);
     
        memcpy(shm, &elem, sizeof(elem));
        printf("%d, %f, %s\n", elem.x, elem.y, elem.z);
    }

    Et comme le dit matafan, aucun élément de ta structure ne doit pointer vers une adresse située en dehors de la shm...
    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
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et comme le dit matafan, aucun élément de ta structure ne doit pointer vers une adresse située en dehors de la shm...
    Je dirais qu'aucun élément ne doit pointer tout court, vu que la shm peut se retrouvée mappée à une adresse différente dans chaque processus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    Oui alors tout ça je comprend bien. Evidemment, chaque processus à sa propre zone memoire virtuelle. Donc passer l'adresse absolue d'une variable est inutile. ok.

    Mon problème c'est que je désire mettre dans la shared memory une structure chainée... Dois-je utiliser l'arithmétique des pointeurs afin de passer comme référence un offset ?

    Merci de votre aide

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu as des éléments de taille fixe, je te conseillerais de faire de ta liste un tableau.
    Et si tu as besoin de chaînage quand même (par exemple, parce que tu fais des insertions/suppressions) tu peux représenter ce chaînage avec des indexes dans le tableau, ce qui t'évitera de calculer les offsets manuellement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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
    Salut
    Ta shm ne peut pas contenir de pointeur parce que de l'autre coté, ces pointeurs ne veulent plus rien dire.

    Si vraiment tu veux être ultra propre, alors tu crées une fonction dédiée au remplissage de la liste chainée ; cette fonction recevant un élément à stocker depuis l'appelant et se chargeant de le mettre où il faut dans la liste.
    Donc tu pourras utiliser cette fonction pour créer ta liste chainée initiale (à partir d'un fichier, d'une saisie, de ce que tu veux). Et tu pourras aussi utiliser cette même fonction pour créer, de l'autre coté, une nouvelle liste chainée à partir des éléments stockés dans la shm ; ces éléments étant eux stockés dans la shm à la façon d'un fichier...
    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]

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si tu as des éléments de taille fixe, je te conseillerais de faire de ta liste un tableau.
    Et si tu as besoin de chaînage quand même (par exemple, parce que tu fais des insertions/suppressions) tu peux représenter ce chaînage avec des indexes dans le tableau, ce qui t'évitera de calculer les offsets manuellement.
    Pourrais-tu me donner un exemple avec le tableau ?

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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