janvier
2012
Une application peut s’exécuter dans des contextes très différents. Le répertoire courant, le répertoire personnel de l’utilisateur, le type de terminal, entres autres, sont indiqués par des variables d’environnement.
En pratique, les variables d’environnement sont des chaînes de caractère sous la forme NOM=VALEUR. Elles sont modifiées par les fichiers d’initialisation du shell par exemple.
Pour accéder aux variables d’environnement d’un processus dans un programme codé en C, il suffit d’utiliser le tableau environ, une variable globale. Il faut le déclarer en début de programme car il n’est pas définit dans les fichiers d’en-têtes standards.
extern char **environ;
Il contient des chaînes de caractères se terminant par le caractère ‘\0′, et se termine lui-même par un pointeur nul.
Exemple de programme listant les variables d’environnement du processus principal.
#include <stdlib.h>
extern char **environ;
int main(void) {
unsigned i;
for (i = 0; environ[i] != NULL; i++) {
fprintf(stdout, "%s\n", environ[i]);
}
return EXIT_SUCCESS;
}
Notez qu’il existe également une autre solution pour lister les variables d’environnement du processus principal, bien que moins recommandée. En effet, il est possible d’utiliser un troisième argument de la fonction main(), envp, qui se comporte comme environ. Exemple :
#include <stdlib.h>
int main(int argc, char *argv[], char *envp[]) {
unsigned i;
for (i = 0; envp[i] != NULL; i++) {
fprintf(stdout, "%s\n", envp[i]);
}
(void) argc;
(void) argv;
return EXIT_SUCCESS;
}
Bon codage !
Euh oui c’est logique en fait.
Quand tu veux récupérer la valeur variable, t’es obligée de parcourir en faisant une comparaison à chaque élément pour la trouver, puis de découper la chaine grâce à l’espace ?
Car je ne les utilise pas. Cela évite des warnings m’indiquant que je les déclare sans les utiliser, et que je le fait volontairement.
tu peux aussi ne pas nommer le paramètre pour ne pas avoir de warning à la compilation. Ex :
int main(int /*argc*/, char * /*argv[]*/, char *envp[])
{
…
Salut,
Tu compiles avec quoi ? Erreur de syntaxe avec Clang 2.8 et GCC 4.4.5 chez moi… Et je ne vois aucune indication dans les normes pour une telle liberté.
Merci pour l’information
Pourquoi castes-tu argc et argv dans le 2e exemple ?