adresse d'une variable d'environnement
Le
Kevin Denis
Bonjour,
je suis sur un système linux x86 32bits.
J'ai des variables d'environnements, et depuis un programme C, je
souhaite connaitre leurs adresses.
Typiquement:
MAVAR="blablable()blablbabla"
export MAVAR
Si je regarde le man, je vois que la fonction getenv à l'air de
faire l'affaire. getenv renvoie un pointeur, et il est de type:
#include <stdlib.h>
char *getenv (const char *name);
J'écris donc:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *p = NULL; //je vais utiliser un pointeur
p = getenv('MAVAR'); //getenv me renvoie un pointeur
printf('Adresse de MAVAR: %p', p); //j'affiche le pointeur
return 0; //comme ça gcc râle moins
}
sauf que ça ne fonctionne pas
J'ai lors de la compilation des warning:
warning: multi-character character constant
et
warning: passing arg 1 of `getenv' makes pointer from integer without a cast
et au lancement le programme ne fait rien d'autre qu'un segfault.
Un conseil pour me montrer ce que je fais mal?
Merci
--
Kevin
je suis sur un système linux x86 32bits.
J'ai des variables d'environnements, et depuis un programme C, je
souhaite connaitre leurs adresses.
Typiquement:
MAVAR="blablable()blablbabla"
export MAVAR
Si je regarde le man, je vois que la fonction getenv à l'air de
faire l'affaire. getenv renvoie un pointeur, et il est de type:
#include <stdlib.h>
char *getenv (const char *name);
J'écris donc:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *p = NULL; //je vais utiliser un pointeur
p = getenv('MAVAR'); //getenv me renvoie un pointeur
printf('Adresse de MAVAR: %p', p); //j'affiche le pointeur
return 0; //comme ça gcc râle moins
}
sauf que ça ne fonctionne pas
J'ai lors de la compilation des warning:
warning: multi-character character constant
et
warning: passing arg 1 of `getenv' makes pointer from integer without a cast
et au lancement le programme ne fait rien d'autre qu'un segfault.
Un conseil pour me montrer ce que je fais mal?
Merci
--
Kevin

Poser une question


p = getenv("MAVAR"); /* getenv me renvoie un pointeur */
Les '' sont réservés en C aux char ('a') [éventuellement aux versions
sur 2 ou 4 octets, mais c'est hors-sujet ici] et non aux chaînes.
Et idem pour le printf, auquel en plus il manque en plus le n.
Mais sinon vouloir connaître l'adresse d'une variable d'environnement en
C, laisse supposer que pour toi (Kevin) cette variable est la même que
sous shell. Ceci n'est pas vrai. Chaque programme a son propre espace
mémoire virtuel, et les variables shell sont passées par valeur et non
par adresse.
--
Éric Lévénez
FAQ de fclc :
C'est du reste le même comportement que lorsque l'on exporte une
variable ("export") dans un script: une fois terminé le script,
l'appelant (en général le shell) ne "verra" pas cette modification qui
était interne au script.
C'est pire. Je ne me souviens pas avoir vu aucune garantie dans la
norme POSIX telle que: getenv("V")==(f(),getenv("V")).
Donc l'intérêt d'obtenir cette adresse est nul.
Le standard énonce explicitely:
The string pointed to may be overwritten by a subsequent call to
getenv(), [CX] [Option Start] setenv(), or unsetenv(), [Option End]
but shall not be overwritten by a call to any other function in
this volume of IEEE Std 1003.1-2001.
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
C'est du reste il me semble ce qui se passe sous Windows (bon, certes,
pas POSIX pour un sou, mais passons), où getenv() renvoi un tableau
calculé à partir de la "vrai" version (qui est notamment codée sur des
caractères 16-bit) en mode Unicode.