Библиотека C рассматривает переменные среды как глобальные настройки, которые вы можете прочитать с помощью getenv
и настроить с помощью setenv
/ putenv
, и которые наследуются через вызовы семейства exec
, но это удобная фикция.Что касается ядра, переменные окружения являются вторым набором аргументов для main
.Это становится понятным, если вы посмотрите на фактический системный вызов execve
, лежащий в основе семейства exec
.Это его прототип C:
int execve(const char *filename, char *const argv[], char *const envp[]);
^^^^^^^^^^^^^^^^^^
Видите этот третий аргумент?Это единственный способ , в котором процесс A устанавливает переменные среды процесса B. 1 Следовательно, единственный время процесс A может устанавливать переменные среды процесса B, когда процесс A запускает процесс B, через fork
и execve
.
Ваша программа запускается с помощью оболочки, поэтому оболочка должна установить свою копию средыпеременные, но у нее нет возможности отправить изменения обратно в оболочку - точно так же, как у функции C нет возможности изменить значения своих аргументов в вызывающей стороне.
1 Не воспитывать ptrace
.