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

Python Discussion :

Pointeur sur un mmap


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Par défaut Pointeur sur un mmap
    Bonjour,

    Je travail actuellement en python3.1 sur une application "multi process". Chaque processe communique par une mémoire partagée gérée par le module mmap. De plus, mon application appel des fonctions en C++ par l'intermédiaire d'une dll. J'utilise donc le module ctypes pour créer un "wrapper" python/C++ : ça marche très bien .

    Mon souci, c'est que je voudrai que mes fonctions en C++ puissent écrire des données directement dans le mmap par l'intermédiaire d'un pointeur. Le module mmap ne permet pas de retourner ce pointeur (c'est à dire une adresse mémoire utilisable en c++). J'ai cherché dans le fichier source du module mmap et je n'ai pas l'impression que le cas de renvoyer ce pointeur
    soit géré.

    Est-ce que quelqu'un aurai une idée pour récupérer un pointeur sur un mmap ?

    Merci

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 045
    Par défaut
    J'y connais rien, mais avec un peu de recherche

    http://tronche.com/gui/x/xlib/input/...erMapping.html

    Non? où j'ai mal compris le peu que j'ai compris


  3. #3
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Salut

    Le module mmap de Python est très certainement écrit en C.
    En C pur, s'entend. Ca veut dire qu'aucune rêgle d'accès de classe ne peut t'empecher de lire ce qu'il y a dans les structures.

    Donc, si ton code C++ met la main sur une structure mmap, tu peux surement trouver l'adresse mémoire quelque part Il ne te reste donc plus qu'à mettre les mains dans le code de mmap.

  4. #4
    Membre régulier
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Par défaut
    fred1599 => merci pour ta réponse ... Mais je ne vois pas le rapport entre le serveur X de linux et le module mmap de python.

    Antoine_935 => le module mmap est effectivement écrit en C. J'ai recherché dans le code source de python dans le module mmap, et la structure C ne permet pas de retourner un pointeur. Pour cela il faut modifier le code source et recompiler python => ce n'est pas une solution viable sachant qu'il faudra changer le code source de python à chaque changement de version de celui-ci.

    Pour rappel, j'ai une application multi-process qui manipule des mmap (utilisés comme mémoire partagée). Je cherche un moyen de trouver l'adresse mémoire d'un mmap. Voici la structure mmap en C (ligne 88 du fichier mmapmodule.c) :
    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
     
    typedef struct {
    	PyObject_HEAD
    	char *	data;
    	size_t	size;
    	size_t	pos;    /* relative to offset */
    	size_t	offset; 
            int     exports;
     
    #ifdef MS_WINDOWS
    	HANDLE	map_handle;
    	HANDLE	file_handle;
    	char *	tagname;
    #endif
     
    #ifdef UNIX
            int fd;
    #endif
     
            access_mode access;
    } mmap_object;
    Ce qui m'intéresse, c'est le pointeur : char* data;

    Cette adresse mémoire sera utilisée en C++ (en créant un pointeur sur cette adresse mémoire) pour écrire (ou lire) directement dans la mémoire (donc dans le mmap).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # En python :
    mem = mmap.mmap(-1, 1024)
     
    # En python, pour pointer sur le mmap
    mem.seek(0)
     
    # Y a pas de moyens pour récupérer l'adresse mémoire en python
    # (Du moins je ne l'ai pas trouvé)
     
    adresse = mem.seek(0)
    Quelqu'un aurait-il une idée pour récupérer cette adresse ?
    Est-ce possible (sans pour autant changer le code source de python) ?

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par Tchef Voir le message
    Antoine_935 => le module mmap est effectivement écrit en C. J'ai recherché dans le code source de python dans le module mmap, et la structure C ne permet pas de retourner un pointeur.
    Faux. Dans le code source que tu as mis ici, on voit clairement le HANDLE (pour Windows) et le File Descriptor (pour linux). C'est l'adresse qu'il te faut.

  6. #6
    Membre régulier
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Par défaut
    Faux. Dans le code source que tu as mis ici, on voit clairement le HANDLE (pour Windows) et le File Descriptor (pour linux). C'est l'adresse qu'il te faut.


    Dans la structure C, il y a le pointeur Il pointe sur l'adresse des données mmap (c'est un pointeur ), donc il me faut la valeur de ce pointeur (l'adresse que le pointeur pointe). J'espère que je suis plus clair.

    Je n'ai pas encore trouvé le moyen de retourner la valeur de ce pointeur sans pour autant changer le code source du mmap. Peut-être que c'est tout simplement impossible.

    Est-il possible de soumettre une proposition d'évolution pour le module mmap (retourner la valeur du pointeur des données) ???

Discussions similaires

  1. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36
  2. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  3. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17
  4. [allegro]passage de pointeur sur image
    Par Gonath dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/12/2003, 18h47
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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