View in Telegram
Процессы и программы: переменные окружения У каждого процесса есть, связанный с ним строковый массив, который называется списком переменных среды (окружения). Каждая из его строк является элементом вида имя=значение. Таким образом, среда представляет собой набор пар имя — значение, которые могут применяться для хранения произвольной информации. Когда создается новый процесс, он наследует копию среды своего родителя. Это простая, но часто используемая форма межпроцессного взаимодействия (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-Образование
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Find friends or serious relationships easily