Forum Programmation.c Charger plusieurs instances d'une bibliothèque dynamique

Posté par  .
Étiquettes : aucune
0
3
avr.
2008
Bien le bonjour,

J'ai un problème technique pour une application un peu tordue : je veux charger plusieurs instances d'une bibliothèque dynamique dans un programme.

Le problème, et c'est bien sûr l'intérêt des bibliothèques partagées, est que si je fais plusieurs appels à dlopen/LoadLibrary, une seule instance sera réellement chargé, avec les mêmes variables globales... alors que je voudrais des espaces mémoires indépendants, pour les data comme pour le text (la bibliothèque en question peut avoir différentes versions), mais entièrement accessible depuis le programme principal.

Par contre, je n'ai pas besoin de faire le chargement à l'init, ce qui devrait simplifier le problème.

À noter que je ne suis pas sectaire sur l'OS, une solution sous Windows peut aussi me convenir...
  • # erreur de conception

    Posté par  . Évalué à 2.

    c'est dans une grande majorité de cas une grosse erreur de conception que d'utiliser des variables globales dans une dll.
    la solution adoptée est généralement d'utiliser une structure encapsulant tes variables et de la passer en paramètre a tes fonctions. exemple :

    typedef struct _MaStructure {
    int ma_variable;
    } context_t;

    void ma_fonction(context_t* context, int parametre1, int parametre2){
    ...
    }

    dans ce cas pas besoin de variables globales.
    • [^] # Re: erreur de conception

      Posté par  . Évalué à 1.

      Effectivement, mais je suis dans la petite minorité des cas nécessitant l'usage de variable globales! De plus, je peux avoir des fonctions faisant partie de l'interface avec le même nom mais un contenu différent...

      En fait, il s'agit plus vraiment de bibliothèque mais plutôt de module, mais l'idée est quand même de réutiliser les outils existants pour les bibliothèques, si possible.
  • # best of des solutions ...

    Posté par  . Évalué à 3.

    Et si tu fait une copie du fichier de ta bibliothèque ?
    juste avant de la recharger ...
    ça devrait le faire ...

    (a conception douteuse, solution douteuse ...)
    • [^] # Re: best of des solutions ...

      Posté par  . Évalué à 1.

      Effectivement c'est moins compliqué que de se repalucher la fonction dlopen... même si c'est un peu douteux comme tu dis!
  • # fork();

    Posté par  (site web personnel) . Évalué à 1.

    Si tu fork() avant chaque appel à dlopen() ça devrait le faire non ?
    Tu rends ensuite chaque variables globales accessible pour le programme principal via des zones de memoire partagées initialisé depuis un tableau et tu envois un pointeur à chaque module.
    Mais c'est un peu alambiqué :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.