/proc/$$/environ
e a variável environ
são independentes. environ
reflete mudanças no ambiente e, de fato, o valor do ponteiro em environ
também muda quando variáveis de ambiente são adicionadas ao ambiente via putenv()
(mas esse é um detalhe de implementação).
Teremos que distinguir entre o nível de chamada do sistema e o nível da biblioteca. No nível de chamada do sistema, o único mecanismo relacionado ao ambiente é o argumento envp
para a chamada execve
. Esse parâmetro deve conter name=value
pares que compõem o ambiente do novo programa. Esse ambiente é copiado para a pilha do novo processo, onde o código de inicialização do espaço do usuário pode pegá-lo.
No nível da biblioteca, temos
- a variável global
environ
, que aponta para uma cópia do ambiente - as funções
getenv()
eputenv()
para examinar e modificar o ambiente - a família de funções
exec*
(não inlcudingexecve
) que, implicitamente (viaenviron
) ou explicitamente (passada por meio de um parâmetro), acessa o ambiente
As funções da biblioteca exec*
finalmente chamam a chamada do sistema execve
. A variável environ
não aponta para o ambiente na pilha; em vez disso, o ambiente é copiado para o heap do processo antes que a variável environ
seja configurada (isso é novamente um detalhe de implementação).
Por que o /proc/$$/environ
não reflete as alterações no ambiente? /proc/$$/environ
é um arquivo virtual fornecido pelo kernel, e o kernel não tem como saber o que está acontecendo nesse nível baixo no espaço de endereço em um processo do usuário. O kernel não tem conhecimento da variável environ
e não tem conhecimento das estruturas de dados usadas pelo processo para armazenar o ambiente.