Existe-t-il un moyen de définir des variables d'environnement sous Linux en utilisant le langage C ?
J'ai essayé setenv()
y putenv()
mais ils ne semblent pas fonctionner pour moi.
Existe-t-il un moyen de définir des variables d'environnement sous Linux en utilisant le langage C ?
J'ai essayé setenv()
y putenv()
mais ils ne semblent pas fonctionner pour moi.
Je vais faire une hypothèse, mais la raison normale pour laquelle ces fonctions semblent ne pas fonctionner n'est pas qu'elles ne fonctionnent pas, mais que l'utilisateur ne comprend pas vraiment comment les variables d'environnement fonctionnent. Par exemple, si j'ai ce programme :
int main(int argc, char **argv)
{
putenv("SomeVariable=SomeValue");
return 0;
}
Si je l'exécute à partir de l'interpréteur de commandes, il ne modifiera pas l'environnement de l'interpréteur de commandes - un processus enfant n'a aucun moyen de le faire. C'est pourquoi les commandes de l'interpréteur de commandes qui modifient l'environnement sont des builtins, et pourquoi vous avez besoin de source
un script qui contient des paramètres de variables que vous souhaitez ajouter à votre shell, plutôt que de simplement l'exécuter.
Tout programme Unix s'exécute dans un processus distinct de celui qui le démarre ; il s'agit d'un processus "enfant".
Lorsqu'un programme est lancé - que ce soit par la ligne de commande ou d'une autre manière - le système crée un nouveau processus qui est (plus ou moins) une copie du processus parent. Cette copie inclut les variables d'environnement du processus parent, et c'est le mécanisme par lequel le processus enfant "hérite" des variables d'environnement de son parent. (tout ceci est en grande partie ce que d'autres réponses ont dit ici)
C'est-à-dire qu'un processus ne jamais fixe son propre les variables d'environnement.
D'autres ont mentionné le sourcing d'un script de l'interpréteur de commandes, comme moyen de définir les variables d'environnement dans le processus actuel, mais si vous avez besoin de définir les variables dans le processus actuel (interpréteur de commandes) de manière programmatique, alors il y a un moyen légèrement indirect qui est possible.
Considérez ceci :
% cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
int i;
for (i=1; i<argc; i++) {
printf("ENV%d=%s\n", i, argv[i]);
}
}
% echo $ENV1
% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
%
Le système intégré eval
évalue son argument comme si cet argument avait été tapé à l'invite du shell. Ceci est un exemple de style sh ; la variante de style csh est laissée comme un exercice !
La variable d'environnement définie par setenv()/putenv() sera définie pour le processus qui a exécuté ces fonctions et sera héritée par les processus lancés par celui-ci. Cependant, elle ne sera pas diffusé sur dans le shell qui a exécuté votre programme.
Pourquoi mon enveloppe autour de setenv() ne fonctionne-t-elle pas ?
Le bloc d'environnement est local au processus, et copié dans les processus enfants. Ainsi, si vous modifiez des variables, la nouvelle valeur n'affecte que votre processus et les processus enfants créés après la modification. Il est certain que cela ne changera pas le shell à partir duquel vous avez lancé le processus.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.