TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #93 6.52K
Процессы и программы: переменные окружения

У каждого процесса есть, связанный с ним строковый массив, который называется списком переменных среды (окружения). Каждая из его строк является элементом вида имя=значение.

Таким образом, среда представляет собой набор пар имя — значение, которые могут применяться для хранения произвольной информации.

Когда создается новый процесс, он наследует копию среды своего родителя. Это простая, но часто используемая форма межпроцессного взаимодействия (IPC), когда среда предоставляет способ переноса информации от родительского процесса к дочернему.

Результат переноса информации от родительского процесса к дочернему является односторонним и однократным. После создания потомка, любой последующий экземпляр может изменить свою собственную среду, и эти изменения будут незаметны извне.

Некоторые библиотечные функции позволяют изменять свое поведение путем установки переменных среды. Это дает возможность пользователю управлять поведением приложения без изменения кода или его перекомпоновки с использованием соответствующей зависимости.

Один из классических примеров - переменная среды LD_LIBRARY_PATH, которую мы ранее затрагивали. Когда программа использует динамические библиотеки, загрузчик ищет их в системных каталогах lib или /usr/lib. Однако с помощью LD_LIBRARY_PATH можно указать альтернативные пути поиска:


$ LD_LIBRARY_PATH=/usr/local/lib ./myapp


Определение переменных окружения

В большинстве оболочек значение может быть добавлено к среде с помощью команды export:


$ SHELL=/bin/bash
$ export SHELL


В примере выше, первой командой создается переменная оболочки, которая, без явного экспорта, не будет унаследована дочерним процессом. Второй вызов определяет переменную для окружения и помещает ее в среду процесса.

В оболочках bash и Korn можно воспользоваться следующей записью:


$ export SHELL=/bin/bash


Показанные выше команды навсегда добавляют значение к окружению оболочки, после чего это окружение наследуется всеми, создаваемыми оболочкой дочерними процессами. Переменная может быть в любой момент удалена командой unset:


$ unset VARIABLE_NAME


В оболочке Bourne shell и ее потомках (bash и Korn) для добавления значений к окружению выполняемой программы, может использоваться такой синтаксис:


$ NAME=value program


Определение будет добавлено к среде только того дочернего процесса, который выполняет указанную программу. Текущий список переменных среды выводится командой printenv:


$ printenv
LOGNAME=mtk
SHELL=/bin/bash
HOME=/home/mtk
PATH=/usr/local/bin:/usr/bin:/bin:.
TERM=xterm


Список переменных среды любого процесса можно изучить, обратившись к характерному для Linux "/proc/PID/environ":


$ cd /proc/2953
$ cat environ
HOME=/home/xodefenderLANG=en_US.UTF-8LOGNAME=xodefender


Обращение к среде из программы

Из программы на языке C, список переменных среды может быть доступен с помощью глобальной переменной environ. Как и argv, переменная environ содержит список указателей на строки, заканчивающиеся нулевыми байтами. Cам список заканчивается значением NULL:


#include <stdio.h>

extern char **environ;

int
main(int argc, char *argv[])
{
char **list;
for (list = environ; *list != NULL; list++) {
puts(*list);
}
exit(EXIT_SUCCESS);
}


Альтернативный метод обращения к списку переменных среды заключается в объявлении для функции main() третьего аргумента:


int main(int argc, char *argv[], char *envp[])


Отдельные значения из среды процесса извлекаются с помощью getenv():


#include <stdlib.h>
char *getenv(const char *name);


Linux++ | IT-Образование
  • 👍 24
  • 🔥 4
  • 👌 1
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →