/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.