if ($answer_counter == 1): ?>
endif; ?>
- Para responder sua segunda pergunta primeiro,
- Trivially, os programas
env e printenv
use environ para listar todo o ambiente.
- A maioria das camadas usa
environ
para copiar cada variável de ambiente em uma variável de shell exportada.
(Por exemplo, no bash,
comandos como set , export e declare (sem argumentos)
listará todo o ambiente, juntamente com as variáveis não exportadas.
- Eu não sei exatamente como eles lidam com isso,
mas
su e sudo passam uma cópia higienizada do ambiente
aos programas que eles invocam.
Eles podem fazer isso iterando pelo ambiente
e decidir quais variáveis passar, quais omitir,
e quais modificar.
- Por que
environ está exposto e documentado ao programador de aplicativos?
- Porque alguns programas precisam disso (veja acima).
- O kernel precisa passar o ambiente para o processo (quando ele é iniciado)
de alguma forma.
getenv e setenv (e algumas outras coisas)
precisa ter acesso ao ambiente.
É complicado para o kernel
para se comunicar com uma rotina de biblioteca que não está ativa
(ou seja, para passar informações para qualquer parte do programa
outro que a rotina que está invocando o kernel).
Torna-se duplamente difícil, dado que,
se você estiver usando bibliotecas estáticas,
getenv e setenv nem serão vinculados à sua imagem do processo
se o programa não ligar para eles.
Usar uma variável global é a solução mais fácil.
- Por que os designers / desenvolvedores fizeram isso dessa maneira?
Por que não?
O processo possui seu ambiente;
é permitido fazer o que quiser com isso.