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

  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 327
    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 327
    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) ???

  7. #7
    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
    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.
    Si c'est ce char*, qu'est-ce qui t'empêche d'y accéder ?
    Si tu reçois l'objet mmap python, ça veut dire que tu as accès à la structure.
    Et comme la structure ne t'empêche pas d'accéder au pointeur, il te suffit de le lire.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Comment lit-on le code source de Python écrit en C , SVP ?

    Que signifie structure C ?

    J’ai consulté la doc sur le module ctypes: noyé.
    Pouvez vous indiquer un tutoriel ctypes qui guiderait un novice ignare avec progressivité, svp.



    Dans le module ctypes je vois:
    16.15.1.14 Pointers
    Ça n’est pas utile pour ton problème, Tchef ?

  9. #9
    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
    Pour lire le code, le mieux est de le télécharger: http://python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2

    Une structure C est un peu l'ancêtre des classes que l'on a actuellement.
    Dans une classe, tu as des attributs: entiers, caractères etc...
    La plupart sont protégés par une visibilité privée, et plus rarement package, protégée ou publique.

    Une structure, c'est pareil. Tu as des attributs: entiers, caractères
    MAIS aucun contrôle d'accès sur les variables. Tout est "publique".

    En somme, une classe est une structure de données pour laquelle le compilateur vérifie qu'on n'accède pas aux attributs auquels on n'a pas droit.


    Si tu veux jouer avec ctypes, tu ferais peut-être bien te t'initier au C pour commencer, ça rendrait très certainement les choses beaucoup plus simples.

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Par défaut
    D'après ce que j'ai compris il veut récupérer l'équivalent du pointeur de ce que retourne la fonction mmap en C originel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
    un HANDLE ou un File Descriptor n'est en aucun cas un pointeur (désolé pour Antoine_935 )
    Un handle est une référence sur un objet généralement sur le tas (heap), alors que les pointeurs pointent vers une zone mémoire.
    même si le tas est aussi en mémoire (physique) la nuance est importante on n'accède pas à la mémoire de la même manière.

    Après lecture du code du fichier mmapmodule.c et navigation sur d'autre forum (anglais) beaucoup de personne se sont posé la question et l'accès au pointer en direct n'a pas été prévu car du point de vue python on manipule le mmap comme un fichier et non comme une zone mémoire.

    Il faudra probablement faire une légère interface supplémentaire (en c) au module mmap pour accéder à ce pointeur, d'après ce que j'ai compris.
    A moins que Antoine_935 puissent nous donner un exemple précis sur ce qu'il entend par "Et comme la structure ne t'empêche pas d'accéder au pointeur, il te suffit de le lire", car de mon coté aussi je suis intéressé, et je ne vois pas trop ce qu'il entend par là.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut @ Antoine935
    tu ferais peut-être bien te t'initier au C pour commencer, ça rendrait très certainement les choses beaucoup plus simples.
    Assurément, assurément.
    Mais pas aussi rapides.

    Après quelques lectures, il est clair en effet que le mot structure que vous employez désigne une notion PRÉCISE en langage C.
    C’est ce mot qui m’a mis dans le brouillard pour suivre votre échange;
    évidemment, puisque je suis ignare en C;
    mais il n’y a pas que cela: je trouve le choix de ce mot ’structure’, qui est d’une généralité qu’ont peu de mots, très malencontreuse pour désigner une chose très précise dans une science aussi rigoureuse que l’informatique.
    Je sais bien qu’on peut dire la même chose de termes comme ’objet’,’classe’,’méthode’ mais pour le mot ’structure’, l’informatique se montre particulièrement trompeuse par manque d’imagination.

    Ta réponse, bien que pas exactement explicite sur ce point, m’a mis la puce à l’oreille, et m’a permis de comprendre rapidement un peu de quoi il retourne en faisant des recherches supplémentaires. Plus rapidement que si j’avais commencé à étudier studieusement un tutoriel sur C.
    Tu me diras que le temps gagné, je le perds en bavardage....

    Ta réponse situe relativement les structures C et les classes de Python, et c’est bien, parce que ça m’a permis de comprendre que ces notions s’inscrivent dans le sujet de la programmation objet et plus généralement de la philosophie des concepts sur lesquells repose la conception des langages. J’ai le sentiment d’avoir gagné du temps. Comme de plus Python est codé en C, j’ai soudain perçu l’intérêt certain qu’il y a à connaître le C et je vais essayer de m’y intéresser.

    Merci.

  12. #12
    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
    On parle plus précisément de "structure de données".
    Mais, les informaticiens étant paresseux (et moi le premier !), on parle de "structure", tout simplement

    Content d'avoir pu (peut-être) te lancer sur la voie du C :p C'est un langage assez brut, mais une valeur sure que ne saurait être détrônée dans le futur
    Bon, ce n'est pas pour autant le meilleur langage actuellement pour des applications standard.

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