No Unix, cada processo tem sua própria cópia independente do ambiente. Um processo obtém seu ambiente inicial quando é criado (via fork()
) copiando o ambiente do processo pai.
Portanto, se você adicionar uma variável ao ambiente do shell antes de chamar a.out, a.out a verá (porque a.out recebeu uma cópia do ambiente do shell, que continha aquela variável).
Se a.out muda o ambiente, isso muda o ambiente de a.out - não o da shell. Se a.out fosse chamar outro programa (por exemplo, usando system()
), esse programa veria o ambiente alterado, porque ele obteria uma cópia do ambiente de a.out.
Quando a.out sai, suas variáveis de ambiente são destruídas; é claro que, se um processo filho estivesse em execução, ele ainda manteria sua cópia (até sair).
Se você modificar o ambiente no shell, enquanto a.out ainda estiver em execução (por exemplo, em segundo plano: a.out &
), então a.out não verá as alterações: o ambiente é copiado apenas na criação do processo.
[Note que este é o caminho típico; o execve
syscall permite que você execute um programa com um ambiente que você especifica, em vez do que foi copiado do processo pai.]