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 ecyrbe . Évalué à 2.
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 calandoa . Évalué à 1.
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 thecat . Évalué à 3.
juste avant de la recharger ...
ça devrait le faire ...
(a conception douteuse, solution douteuse ...)
[^] # Re: best of des solutions ...
Posté par calandoa . Évalué à 1.
# fork();
Posté par Thibault (site web personnel) . Évalué à 1.
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.