Но когда мы впервые добавляем новое имя, мы должны вызвать malloc, чтобы получить> место для нового списка указателей. Мы копируем старый список среды в эту новую область и сохраняем указатель на строку name = value в конце списка указателей. Но большинство указателей в этом списке все еще указывают на строки с именем = значение над вершиной стека (говорится в Расширенном программировании в среде UNIX.) Похоже, что в очереди есть новые созданные списки среды или строки.
Переменные среды хранятся вместе с аргументами командной строки в верхней части макета памяти процесса над стеком.
Окружающая среда (пары имя / значение) живет в верхней части стека. Рисунок 2 и Раздел 3 состояния запуска бинарного файла ELF Linux / i386 показывают, где находится среда. Этот документ несколько устарел, так как вспомогательный вектор ELF также находится в стеке.
Вы можете проверить это с помощью небольшой программы на C:
#include <stdio.h> int main(int argc, char **argv, char **env) { printf("argv holds %p\n", argv); printf("argv[0] holds %p\n", argv[0]); printf("env holds %p\n", env); printf("env[0] holds %p\n", env[0]); return 0; }
Это не отвечает на другой аналогичный вопрос: когда вы export SOME_VAR
в оболочку, где эта оболочка помещает новую переменную среды? Оболочка должна сохранять свою среду в структуре данных, которая может быть расширена по желанию, а затем (преобразована в массив и), используемая в качестве envp
(3) в системных вызовах execve(2)
.
Переменные среды – это проявление оболочки, которую вы используете. Я бы предположил, что окружающая среда в целом представляет собой структуру данных, которая является составной частью того, что составляет процесс.
Я бы не ожидал, что их объединят в любом месте для всех процессов, но каждый процесс, скорее всего, сохранит переменные среды вместе с данным процессом вместе с другой информацией, относящейся к данному процессу.
Вы можете видеть это, если вы ткнете вокруг файловой системы /proc
которая поддерживает информацию о процессах, когда они работают на вашем ядре.
Если мы рассмотрим один из моих процессов bash
:
$ ps -eaf| grep bash | tail -1 saml 12095 3211 0 May10 pts/53 00:00:04 bash
Рассматривая эту область процессов /proc
(перечислите первые 5):
$ sudo cat /proc/12095/environ | tr '\0' '\n' | head -5 rvm_log_path=/home/saml/.rvm/log rvm_ruby_string=ruby-1.9.2-p180 TERM=xterm SHLVL=1 KDEDIRS=/usr
Это показывает, по крайней мере, начальную среду, с которой начался этот процесс. Я полагаю, что /proc/PID/environ
не отражает активного представления этой среды процессов, поскольку она добавляется.