No modelo unix, iniciar outro programa envolve duas primividades:
-
fork()
cria uma cópia (quase) idêntica do processo de chamada. O novo processo é chamado de processo filho e o processo original é chamado de processo pai. O processo filho executa o mesmo código do original, tem as mesmas permissões, tem o mesmo ambiente e recebe uma cópia da memória de dados mutável do processo pai. A diferença mais visível entre os dois processos é que eles têm diferentes IDs de processo e diferentes IDs de processo pai (o PPID da criança é o PID do pai). -
execve()
substitui o código e os dados do processo atual por código e dados carregados de um arquivo executável. Essa chamada de sistema leva o novo ambiente do processo como um argumento.
A maioria das funções de alto nível criadas em torno de fork()
e execve()
passam o ambiente atual do processo para execve()
. Assim, a menos que o processo mude seu próprio ambiente ou chame execve()
diretamente, o programa chamado herdará o ambiente do programa de chamada.
Os shells normalmente passam seu ambiente para os programas que eles chamam. Você pode alterar o ambiente de um shell a qualquer momento atribuindo um valor a uma variável de ambiente ( foo="some value"
; você deve chamar export foo
se a variável já não estiver no ambiente) ou remover uma variável do ambiente desativando-o ( unset foo
). Se você deseja iniciar um programa externo com variáveis de ambiente diferentes ou adicionais, há uma sintaxe de atalho:
foo="some value" mycommand
é aproximadamente equivalente a
(foo="some value"; export foo; exec mycommand)
(onde os parênteses restringem o escopo da configuração de foo
).