Процессы и программы: переменные окружения
У каждого процесса есть, связанный с ним строковый массив, который называется списком переменных среды (окружения). Каждая из его строк является элементом вида
имя=значение.
Таким образом, среда представляет собой набор пар
имя — значение, которые могут применяться для хранения произвольной информации.
Когда создается новый процесс, он наследует копию среды своего родителя. Это простая, но часто используемая форма межпроцессного взаимодействия (
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-Образование