Onde a string de ambiente é armazenada?

5

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.

    
por user39234 15.05.2013 / 16:29

3 respostas

7

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.

    
por 15.05.2013 / 17:22
4

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.

    
por 15.05.2013 / 17:35
3

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.

Exemplo

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.

    
por 15.05.2013 / 17:33