Re: vie des variables d'environnement
mpg :
> Je me pose des questions existentielles sur les conditions de vie des
> variables d'environnement. En fait, une variable d'environnement, c'est
> quoi vraiment ?
Une string de la forme «foo=bar» quelque part dans la mémoire d'un
process. Un process appelle la fonction «putenv» avec cette string en
argument, qui la stocke dans une table. Par la suite, quand le process
appelle la fonction «getenv» sur la string «foo», «getenv» va
rechercher dans la table et trouve cette string. Quand le process se
duplique via fork, la table est dupliquée comme toute la mémoire du process,
et les deux process résultants ont le même environnement. Enfin, quand un
process utilise l'appel «execve» pour remplacer son code par un nouveau
programme, il lui passe en argument un tableau d'environnement
(généralement, le sien), que le noyau va recopier dans la mémoire du
programme qu'il lance, à un endroit où le getenv du programme lancé va
regarder.
> Par exemple, dans un shell, y'a des variables définies, comme TERM
TERM, il vient généralement de ce qui a lancé le shell. Par exemple, dans un
xterm, xterm forke, et dans le fils, avant d'exécuter le shell, il rajoute
«TERM=xterm» dans son environnement.
> ou PS1
Là, ce n'est normalement pas une variable d'environnement, mais une variable
interne du shell. La différence est qu'elles ne sont pas transmises à
travers un execve. Dans un shell, quand tu fais un «foo=bar», ça ne crée
normalement qu'une variable interne. Il faut dire «export foo» pour lui
dire d'en faire une variable d'environnement. Quand tu fais un «$foo», le
shell cherche «foo» à la fois dans son environnement et dans sa liste de
variables internes.
> dont je me demande précisément d'où elles viennent : sont-ce des
> options sur la ligne de commande qui lance le shell, y a-t'il un autre
> mécanisme en jeu ?
Tous les process descendent à travers une série de fork et exec du premier
process lancé. Les environnements se voient ajouter ou retirer des variables
à diverses étapes en chemin...
> Pareil pour la conservation de variables comme TERM quand on fait du ssh
> ou autre.
Ça, c'est le client ssh qui transmet au sshd à l'autre bout une liste de
variables d'environnements, et ce dernier qui les ajoute dans son
environnement avant d'executer le shell.
|