Exceção de herança de variáveis de ambiente

6

Citado em Wikipédia :

By default, when a process is created it inherits a duplicate environment of its parent process, except for explicit changes made by the parent when it creates the child. At API level, these changes must be done between fork and exec. Alternatively, from shells such as bash, you can change environment variables for a particular command invocation by indirectly invoking it via env or using the ENVIRONMENT_VARIABLE=VALUE notation.

Eu entendo que "quando um processo é criado ele herda um ambiente duplicado de seu processo pai". Mas eu queria saber o que a exceção "mudanças explícitas feitas pelo pai quando cria o filho" realmente significa? Eu não entendo como os exemplos na API e nos shells são exemplos da exceção.

    
por Tim 31.07.2011 / 18:20

2 respostas

10

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

    
por 31.07.2011 / 23:25
2

As APIs referem-se à família exec de C funções que são usadas para executar outro processo.

A sequência típica de um processo para iniciar outro é primeiro fork , em seguida, no filho recém-criado, chame uma das funções exec .

Entre o fork e o exec , no processo filho, o ambiente pode ser alterado antes do início do executável de destino.

O execle e execvpe também permitem que o processo de chamada passe diretamente no ambiente de destino.

Se execle e execvpe não forem usados e o ambiente não for modificado entre as chamadas para fork e exec no filho, a regra normal será aplicada.

Os exemplos de shell servem para mostrar como você pode alterar o ambiente para um filho do seu shell. Se o shell não utilizasse alguns dos "truques" acima, ele não poderia permitir que você fizesse isso - todos os processos filhos receberiam uma cópia exata do ambiente atual do shell.

    
por 31.07.2011 / 18:56