[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Получение доступа к переменным среды

Ранее экспортированные shell-переменные включены в среду процесса.
Shell-переменные расположены в стеке и доступ к ним осуществляется так
же, как и к аргументам командной строки. Таблица адресов содержит
адреса строк. Каждая строка имеет вид имя=значение и представляет
собой shell-переменную, известную процессу. Таблица заканчивается
нулевым символом NULL.
На странице руководства по exec(2) показана возможность использования
третьего аргумента в main:
main(int argc, char **argv, char **envp) /* or char *envp[] */
где envp - это адрес таблицы адресов. На той же странице руководства
появляется extern char *environ. Значением этой глобальной переменной
является адрес таблицы.
putenv(3C) используется, чтобы внести новую shell-переменную и ее
значение в среду процесса, или чтобы изменить значение уже
существующей shell-переменной. getenv(3C) возвращает значение
конкретной shell-переменной.

 . третий аргумент main():

   main(int argc, char **argv, char *envp)
          /* or char **envp */



 . внешняя переменная environ

   extern char **environ;



 . библиотечные функции getenv(3C) и putenv(3C)

Значение конкретной shell-переменной может быть получено с помощью
getenv(3C). Аргументом этой функции является имя переменной, значение
которой мы хотим получить. getenv(3C) возвращает указатель на
значение. Поиск осуществляется в таблице, на которую указывает
environ, по имени переменной.
Аргументом putenv(3C) является строка вида "имя=значение". putenv(3C)
вносит переменную имя и ее значение в среду вызвавшего процесса.
putenv(3C) возвращает ноль в случае успеха и не ноль, если внесение не
произошло.
Если putenv(3C) изменяет значение существующей переменной, таблица
адресов по прежнему будет оставаться в стеке. Только адрес,
указывающий на существующую переменную, будет изменен на адрес в
сегменте данных. Если вносится новая переменная, таблица адресов
перемещается в сегмент данных. Адрес новой переменной в таблице будет
адресом в сегменте данных, а адреса всех остальных переменных
останутся адресами в стеке. На странице руководства по putenv(3C) в
разделе ПРЕДУПРЕЖДЕНИЕ говорится, что должна использоваться переменная
environ, а не третий аргумент main. После размещения новой переменной
с помощью putenv(3C), environ будет содержать адрес перемещенной
таблицы в сегменте данных. envp будет указывать на первоначальную
таблицу, расположенную в стеке.
Страница руководства также предупреждает против вызова putenv(3C) с
локальными переменными в качестве аргументов. Так как локальная
переменная находится в стеке, ее адрес в таблице environ будет адресом
в стеке. Эта память будет чиститься при возвращении из функции.
Следующие страницы демонстрируют работу getenv() и putenv() с таблицей
environ.

getenv(3C)

ИМЯ

      getenv - возвращает значение переменной с заданным именем

ИСПОЛЬЗОВАНИЕ

      #include <stdlib.h>

      char *getenv(const char *name)

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

      успех - указатель на значение

      неуспех - NULL-указатель.




putenv(3C)

ИМЯ

      putenv - изменяет или вносит значение в среду процесса

ИСПОЛЬЗОВАНИЕ

      #include <stdlib.h>

      int putenv (char *string);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

      успех - 0

      неуспех - не ноль, если нет достаточно памяти