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 :

pointeurs dans une memoire partagée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Points : 25
    Points
    25
    Par défaut pointeurs dans une memoire partagée
    bonjour,

    je souhaiterais mettre une chaine doublement chainée dans une mémoire partagée pour que deux programmes puissent y avoir accés.chaque chainon a un ID(int) un pointeur sur l'element précedent et suivant
    En fait un des 2 programmes créer la memoire partagée ainsi que la chaine située à l'interieur.
    Le 2e programme accede bien a cette memoire partagée ,il affiche bien l'id de l'élement mais dés qu'il s'agit d'accéder aux pointeurs pour aller sur le suivant ou le precedent, jle programme plante et j'ai une 'segmentation fault'.
    J'avais lu qu'un pointeur n'a de valeur que pour le programme qui le créé, quant est il lorsque ce pointeur est dans une memoire partagée...?
    est ce que je peux manipuler les pointeurs créé par le programme 1 dans le programme 2 ?

    merci par avance

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    du code
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Points : 25
    Points
    25
    Par défaut
    je voudrais deja savoir si c'est possible svp

    merci

  4. #4
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Non, ce n'est pas possible, à moins que tu utilises des processus légers. Chaque programme possède son propre espace d'adressage particulier, sous les OS classiques, bons, qui sont respectables.

    C'est le genre de trucs que les électroniciens n'ont pas encore compris qu'il ne faut pas faire : je travaille avec eux en ce moment, et ils ont voulu faire un truc dans ce genre-là... bien-sûr, sous Linux, et tout OS qui se respecte, ce n'est pas possible !

    Faut pas essayer de faire des trucs si dégueulasses !
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    C'est possible (au moins avec la plupart des Un*x) mais c'est parfois plus delicat que ca en a l'air car il faut s'assurer que la memoire partagee est bien mappee au meme endroit par tous les processus. Le plus sur, c'est d'utiliser des deplacements par rapport au debut de la zone de memoire partagee plutot que des pointeurs.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Points : 25
    Points
    25
    Par défaut
    Le plus sur, c'est d'utiliser des déplacements par rapport au debut de la zone de mémoire partagée plutot que des pointeurs.
    aurais tu des exemples, ca m'intéresserait de voir ca

    merci

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par iznogoud36
    aurais tu des exemples, ca m'intéresserait de voir ca

    merci
    Rien que je puisse montrer et j'ai pas le temps de faire quelque chose simplement pour montrer la technique.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Sous système unix et dérivés il y a mmap() qui permet de faire de l'IPC (Inter Process Communication).

    cf. : http://en.wikipedia.org/wiki/Mmap
    man page : http://www.die.net/doc/linux/man/man3/mmap.3.html
    exemple : http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html

    sous Windows, le concept de mémoire partagée existe aussi, via les fonctions de "mapped files" : CreateFileMapping(), etc.

    Exemple : http://msdn2.microsoft.com/en-us/library/aa366551.aspx
    fonctions : http://msdn2.microsoft.com/en-us/library/aa366781.aspx

  9. #9
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    il faut s'assurer que la memoire partagee est bien mappee au meme endroit par tous les processus.
    Rien n'est moins sûr, et si le processus tente d'accéder à un endroit auquel il n'a pas le droit d'accéder, il ne pourra jamais le faire, même en installant un handler pour le signal SIGSEGV et en évitant de planter le programme.

    Le cas de mmap() me paraît peu probable : mmap() sert à mapper des fichiers dans des zones mémoire, ni plus ni moins. Peut-être que sous certains systèmes l'implantation est défaillante, mais a priori...

    Citation Envoyé par Jean-Marc.Bourguet
    Le plus sur, c'est d'utiliser des deplacements par rapport au debut de la zone de memoire partagee plutot que des pointeurs.
    Quelle est-elle cette zone partagée ? Moi, je n'en connais pas.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Certaines implémentations de mmap() permettent de faire de la mémoire partagée entre un processus et ses fils futurs. Généralement, c'est marqué dans la doc de l'implémentation en question.

    Mais généralement, sous un systèmes unixoïde on utilise les vraies fonctions d'IPC: shmget() et consorts (System V) ou l'équivalent POSIX s'il y en a un.
    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.

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc
    Certaines implémentations de mmap() permettent de faire de la mémoire partagée entre un processus et ses fils futurs. Généralement, c'est marqué dans la doc de l'implémentation en question.
    Plusieurs processus peuvent mapper la meme zone du meme fichier.

    Mais généralement, sous un systèmes unixoïde on utilise les vraies fonctions d'IPC: shmget() et consorts (System V) ou l'équivalent POSIX s'il y en a un.
    shm* fait partie de POSIX (enfin, de l'extension XSI de POSIX).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Plusieurs processus peuvent mapper la meme zone du meme fichier.
    Sans parler de fichier, je parle de commandes de mmap() sur du vide qui allouaient de la mémoire "partagée pour les fils", je crois avoir notamment vu ça sur HP-UX.

    shm* fait partie de POSIX (enfin, de l'extension XSI de POSIX).
    Je ne sais pas, car on parle toujours "d'IPC SystemV contre IPC POSIX", notamment pour les files de messages et les sémaphores...

    Et je sais que notre vieil HP-UX retournait ENOTIMPL pour les IPC POSIX...
    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.

  13. #13
    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
    en plus il me semble me souvenir que mmap et dérivés, lorsque la table est modifiée, on doit recharger le tout, non ?

    Donc on gagne éventuellement en mémoire, mais on perd en temps...
    "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

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par souviron34
    en plus il me semble me souvenir que mmap et dérivés, lorsque la table est modifiée, on doit recharger le tout, non ?
    Quelle table?

    Si tu mappes deux fois le meme fichier en SHARED, les modif sont visibles immediatement d'un process a l'autre, meme si elles ne sont pas sur le disque.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    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
    ok ce sont des vieux souvenirs...
    "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

  16. #16
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    Si je devrais coder une telle solution, j'opterai pour une solution travaillant avec un tableau. Les pointeurs seraient remplacés par des index.
    Bien le bonjour chez vous
    Jowo

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

Discussions similaires

  1. malloc dans une memoire partagée
    Par iznogoud36 dans le forum C
    Réponses: 7
    Dernier message: 02/07/2007, 16h43
  2. Réponses: 2
    Dernier message: 26/11/2006, 10h51
  3. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  4. Réponses: 2
    Dernier message: 15/11/2004, 15h12
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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