Variáveis de ambiente são armazenadas junto com argumentos de linha de comando no topo do layout da memória do processo, acima da pilha.
But when we first time we adding a new name,we have to call malloc to obtain >room for a new list of pointers. We copy the old environment list to this new area and store a pointer to the name=value string at the end of the list of pointers.But most of the pointers in this list still point to name=value strings above the top of the stack(said in the Advanced Programming in the UNIX Environment.).It sounds like that are there any new created environment lists or strings stored in the queue.
Variáveis de ambiente são armazenadas junto com argumentos de linha de comando no topo do layout da memória do processo, acima da pilha.
O ambiente (pares nome / valor) vive no topo da pilha. A Figura 2 e a Seção 3 do estado de inicialização de um binário ELF do Linux / i386 mostra onde o ambiente está. Esse documento está um pouco desatualizado, já que vetor auxiliar ELF também vive na pilha.
Você pode verificar isso com um pequeno programa em C:
#include <stdio.h>
int main(int argc, char **argv, char **env)
{
printf("argv holds %p\n", argv);
printf("argv[0] holds %p\n", argv[0]);
printf("env holds %p\n", env);
printf("env[0] holds %p\n", env[0]);
return 0;
}
Isso não responde a outra pergunta semelhante: quando você faz export SOME_VAR
em um shell, onde esse shell coloca a nova variável de ambiente? Um shell deve manter seu ambiente em uma estrutura de dados que pode ser expandida à vontade e, em seguida, (convertido em uma matriz e) usado como o argumento envp
(3rd) em execve(2)
system calls.
As variáveis de ambiente são uma manifestação do shell que você está usando. Eu imagino que o ambiente como um todo é uma estrutura de dados que faz parte do que compõe um processo.
Eu não esperaria que eles fossem mantidos juntos em qualquer lugar singular para todos os processos, mas cada processo mais provavelmente mantém as variáveis de ambiente junto com um determinado processo junto com outras informações relacionadas a um determinado processo.
Você pode ver isso se você pesquisar o sistema de arquivos /proc
, que mantém informações sobre processos enquanto eles são executados no seu kernel.
Se procurarmos um dos meus processos bash
:
$ ps -eaf| grep bash | tail -1
saml 12095 3211 0 May10 pts/53 00:00:04 bash
Olhando para este processo /proc
area (liste os primeiros 5):
$ sudo cat /proc/12095/environ | tr '$ ps -eaf| grep bash | tail -1
saml 12095 3211 0 May10 pts/53 00:00:04 bash
' '\n' | head -5
rvm_log_path=/home/saml/.rvm/log
rvm_ruby_string=ruby-1.9.2-p180
TERM=xterm
SHLVL=1
KDEDIRS=/usr
Isso mostra pelo menos o ambiente inicial com o qual esse processo começou. Acredito que o /proc/PID/environ
não reflete uma representação ativa desse ambiente de processos à medida que ele é aumentado.