Intereting Posts
Настроить firewalld для OpenVPN (сервер-мост) в Fedora 20 Неопознанное обслуживание групп Как поймать мои события службы bluetooth Репозиторий локальных обновлений CentOS 6 и обновления для системы безопасности Как использовать Linux без каких-либо пользователей и разрешений Автоматически разблокировать ключи на удаленном узле, доступ к которому осуществляется через SSH Разница между размером блока и размером кластера Отдельное имя хоста сервера, отображаемое в журналах cron этого сервера Как читать / изменять контекст SELinux на смонтированном изображении ext4 из системы, отличной от SELinux? kioclient KMimeTypeRepository :: родители: "/ usr / share / mime / subclasses" относится к неизвестному mimetype "application / vnd.ms-excel …" Отображать цвета в сценарии оболочки Debian Lenny Server скомпрометирован – нет знака точки вторжения? Вопрос о патче Как проверить версию mod_ssl.so? Случайная выборка и вывод наибольшего значения

Где хранится фактическая строка среды?

Но когда мы впервые добавляем новое имя, мы должны вызвать 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 не отражает активного представления этой среды процессов, поскольку она добавляется.