Définir des variables d'environnement dans C
Est-il un moyen de définir des variables d'environnement sous Linux à l'aide de C?
J'ai essayé setenv()
et putenv()
, mais ils ne semblent pas être de travailler pour moi.
- Pourquoi pensez-vous qu'ils n'ont pas de travail? (Qui est, comment avez-vous testé ce? la fonction getenv?)
- Pourriez-vous poster un exemple de code et une démo montrant comment ils ne travaillent pas?
Vous devez vous connecter pour publier un commentaire.
Je vais faire une sauvage suppose ici, mais la normale de raison pour que ces fonctions semblent ne pas fonctionner n'est pas parce qu'ils ne fonctionnent pas, mais parce que l'utilisateur n'a pas vraiment de comprendre comment les variables d'environnement de travail. Par exemple, si j'ai ce programme:
Et puis je le lance à partir du shell, elle ne sera pas modifier le shell de l'environnement - il n'y a aucun moyen pour un enfant de processus pour le faire. C'est pourquoi le shell les commandes qui modifient l'environnement sont des objets internes, et pourquoi vous avez besoin de
source
un script qui contient les paramètres de variable que vous souhaitez ajouter à votre shell, plutôt que de simplement l'exécuter.source
il. (BTW, dans la plupart des coquilles. script
est le même quesource script
et beaucoup moins de frappe.)man -k tz
pour certaines options. Sur mon Mac OS X de la machine ce qui se voit esttzset (3)
...Tout unix programme s'exécute dans un processus distinct du processus qui commence; c'est un 'enfant' processus.
Lorsqu'un programme est lancé -- être qu'à la ligne de commande ou de toute autre façon -, le système crée un nouveau processus qui est (plus ou moins) une copie du processus parent. Cet exemplaire comprend les variables d'environnement dans le processus parent, et c'est le mécanisme par lequel le processus de l'enfant "hérite" les variables d'environnement de son parent. (tout ceci est en grande partie ce que d'autres réponses ici l'ont dit)
Qui est un processus uniquement jamais définit sa propre variables d'environnement.
D'autres ont mentionné approvisionnement d'un script shell, comme un moyen de définition des variables d'environnement dans le processus actuel, mais si vous avez besoin de définir des variables dans le courant (shell) processus de programmation, puis il y a une légère façon indirecte que c'est possible.
Considérez ceci:
Le haut-
eval
évalue son argument comme si cet argument était tapé à l'invite du shell. C'est un poisson de style de l'exemple de la csh-style variante est laissé comme exercice!source
oueval
, il y a quelques options (bien sûr, si vous voulez être mis au courant ou un processus enfant, alors il suffit d'utilisersetenv
). Notez queeval
n'est pas seulement bash – c'est en posix, je ne sais pas ce que le *csh équivalent.La variable d'environnement définie par setenv()/putenv() sera établi pour le processus qui a exécuté ces fonctions et sera héritée par le processus lancé par elle. Toutefois, il ne sera pas diffusé dans le shell qui a exécuté votre programme.
Pourquoi n'est pas mon wrapper autour de setenv() de travail?
Le bloc d'environnement est un processus local, et copié sur les processus enfants. Donc, si vous modifiez les variables, la nouvelle valeur n'affecte que le processus et les processus enfants généré après le changement. Assurément, il ne changera pas le shell lancé de.