As cadeias de caracteres acessíveis via 'environ' global não refletem qualquer mudança no ambiente?

0

De link

the file /proc/$$/environ ... does not reflect any changes to the environment, but just reports what the program received when it was execed by the process.

Do APUE:

Each program is also passed an environment list. Like the argument list, the environment list is an array of character pointers, with each pointer containing the address of a null-terminated C string. The address of the array of pointers is contained in the global variable environ:

extern char **environ;

Access to specific environment variables is normally through the getenv and putenv functions, described in Section 7.9, instead of through the environ variable. But to go through the entire environment, the environ pointer must be used.

/proc/$$/environ e a variável global environ são independentes uns dos outros ou são consistentes entre si?

As strings acessadas via environ também não refletem nenhuma alteração no ambiente, mas apenas reportam o ambiente recebido por execve() ?

Ou as strings acessadas via environ sempre refletem qualquer alteração nelas, assim como getenv sempre obtém as strings de ambiente atualizadas?

As strings acessadas via getenv sempre refletem qualquer alteração e estão sempre atualizadas?

Obrigado.

    
por Tim 16.04.2018 / 05:17

1 resposta

2

/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() e putenv() para examinar e modificar o ambiente
  • a família de funções exec* (não inlcuding execve ) que, implicitamente (via environ ) 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.

    
por 16.04.2018 / 08:17