OVH Cloud OVH Cloud

variable static dans une librairie

4 réponses
Avatar
françois M.
Bonjour,

Soit la fonction se trouvant dans une librairie dynamique

void f()
{
static char chaine[10];
// code
}

Je voudrais savoir si la variable static chaine est mapée dans l'espace
mémoire des programmes qui utilisent cette fonction, ou bien si elle est
mappée dans l'espace mémoire de la lib.
Merci.

4 réponses

Avatar
kanze
"françois M." wrote in message
news:<brbmf4$fsr$...

Soit la fonction se trouvant dans une librairie dynamique

void f()
{
static char chaine[10];
// code
}

Je voudrais savoir si la variable static chaine est mapée dans
l'espace mémoire des programmes qui utilisent cette fonction, ou bien
si elle est mappée dans l'espace mémoire de la lib.


Je ne suis pas sûr de comprendre la question. Un lib n'a pas d'espace
mémoire. Les espaces mémoire n'existent que lors de l'éxecution, et sont
propre au processus. En supposant que j'ai bien compris ce que tu
entends par « espace mémoire ».

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
françois M.
a écrit dans le message de
news:
"françois M." wrote in message
news:<brbmf4$fsr$...

Soit la fonction se trouvant dans une librairie dynamique

void f()
{
static char chaine[10];
// code
}

Je voudrais savoir si la variable static chaine est mapée dans
l'espace mémoire des programmes qui utilisent cette fonction, ou bien
si elle est mappée dans l'espace mémoire de la lib.


Je ne suis pas sûr de comprendre la question. Un lib n'a pas d'espace
mémoire. Les espaces mémoire n'existent que lors de l'éxecution, et sont
propre au processus. En supposant que j'ai bien compris ce que tu
entends par « espace mémoire ».


Admettons que j'ai deux programmes A et B qui utilisent cette fonction f()
qui se trouve elle dans une librairie dynamique. Au lancement des deux
process A et B, chacun a son propre espace mémoire ainsi qu'une zone 'bss'
distincte l'une de l'autre.
Est-ce que chaque process A et B aura chacun une variable 'chaine' dans son
'bss' ou bien la variable 'chaine' sera partagée entre tous les process qui
appellent cette fonction. En gros, je voudrais savoir comment sont gérées
les variables globales qui se trouvent dans des librairies dynamiques.
Sont-elles communes ou bien le linker en crée-t-il une pour chaque
exécutable au moment de la compilation ?

Merci.


Avatar
Raphael Tosto
Les deux applis A et B auront chacune une copie distincte da la variable
'chaine'.

Sauf si tu utilise un Windows 16 bits ( les DLLs étant chargé dans l'espace
systeme), il y a une seule variable 'chaine' partagée par toutes les
instances


"françois M." a écrit dans le message de
news:brbmf4$fsr$
Bonjour,

Soit la fonction se trouvant dans une librairie dynamique

void f()
{
static char chaine[10];
// code
}

Je voudrais savoir si la variable static chaine est mapée dans l'espace
mémoire des programmes qui utilisent cette fonction, ou bien si elle est
mappée dans l'espace mémoire de la lib.
Merci.





Avatar
James Kanze
"françois M." writes:

|> a écrit dans le message de
|> news:
|> > "françois M." wrote in message
|> > news:<brbmf4$fsr$...

|> > > Soit la fonction se trouvant dans une librairie dynamique

|> > > void f()
|> > > {
|> > > static char chaine[10];
|> > > // code
|> > > }

|> > > Je voudrais savoir si la variable static chaine est mapée
|> > > dans l'espace mémoire des programmes qui utilisent cette
|> > > fonction, ou bien si elle est mappée dans l'espace mémoire
|> > > de la lib.

|> > Je ne suis pas sûr de comprendre la question. Un lib n'a pas
|> > d'espace mémoire. Les espaces mémoire n'existent que lors de
|> > l'éxecution, et sont propre au processus. En supposant que j'ai
|> > bien compris ce que tu entends par « espace mémoire ».

|> Admettons que j'ai deux programmes A et B qui utilisent cette
|> fonction f() qui se trouve elle dans une librairie dynamique. Au
|> lancement des deux process A et B, chacun a son propre espace
|> mémoire ainsi qu'une zone 'bss' distincte l'une de l'autre.

|> Est-ce que chaque process A et B aura chacun une variable 'chaine'
|> dans son 'bss' ou bien la variable 'chaine' sera partagée entre
|> tous les process qui appellent cette fonction.

Formellement, ça dépend du système, mais dans tous les
systèmes que je connais, les processus ont chaqu'un leur propre
espace d'adressage (au moins de démander explicitement de la
mémoire partagée). En général aussi, le segment de texte (le
code) se mappe au ficher d'origine, mais toute la reste a aussi ces
propre segments de swap pour la pagination.

|> En gros, je voudrais savoir comment sont gérées les variables
|> globales qui se trouvent dans des librairies dynamiques. Sont-elles
|> communes ou bien le linker en crée-t-il une pour chaque
|> exécutable au moment de la compilation ?

Au moment du chargement dynamique, le chargeur s'occupe de trouver la
mémoire (virtuelle) nécessaire pour que chaque processus ait
l'impression d'avoir sa propre copie de tout.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93