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

Эта программа показывает, как переменные среды первоначально
расположены в стеке, и что environ и третий аргумент main() указывают
на одну и ту же таблицу адресов. Также демонстрируется использование
getenv(3C) и putenv(3C).
   4      Внешняя переменная environ содержит адрес таблицы, в которой
          хранятся   указатели    на   все    переменные    командного
          интерпретатора shell.
   6      При запуске  main значение третьего параметра envp такое же,
          как и у environ.
   10     printenv() печатает  значение env  и environ, а также адреса
          из таблицы  и строку  (имя=значение), расположенную по этому
          адресу. Останавливается по достижению нулевого адреса.
   11     putenv("TZ=PST8PDT")   изменяет    значение    TZ.    Адрес,
          указывающий значение  переменной TZ,  указывает  уже  не  на
          стек, а  на  сегмент  данных,  т.к.  используется  строковая
          константа.
   13-14  Переменная WARNING вноситься в среду и печатается содержание
          среды.
   15     Печать значения, возвращенного getenv(3C), в виде строки.
   18-30  Описание printenv()

Файл: envex.c
$ envex
 1 envp contains c0020060
 2 environ contains c0020060
 3 My environment variables are:
 4 (c0020060) = c0020006 -> HOME=/home/jrs
 5 (c0020064) = c0020015 -> LOGNAME=jrs
 6 (c0020068) = c0020021 -> MAIL=/var/mail/jrs
 7 (c002006c) = c0020034 -> PATH=/usr/bin:.
 8 (c0020070) = c0020049 -> TZ=EST5EDT
 9
10 envp contains c0020060
11 environ contains c0020060
12 My environment variables are:
13 (c0020060) = c0020006 -> HOME=/home/jrs
14 (c0020064) = c0020015 -> LOGNAME=jrs
15 (c0020068) = c0020021 -> MAIL=/var/mail/jrs
16 (c002006c) = c0020034 -> PATH=/usr/bin:.
17 (c0020070) = 80002d98 -> TZ=PST8PDT
18
19 envp contains c0020060
20 environ contains 80006498
21 My environment variables are:
22 (80006498) = c0020006 -> HOME=/home/jrs
23 (8000649c) = c0020015 -> LOGNAME=jrs
24 (800064a0) = c0020021 -> MAIL=/var/mail/jrs
25 (800064a4) = c0020034 -> PATH=/usr/bin:.
26 (800064a8) = 80002d98 -> TZ=PST8PDT
27 (800064ac) = 80002da4 -> WARNING=Don't use envp after putenv()
28
29 value of WARNING is: Don't use envp after putenv()

Замечание: putenv(3C) для новой переменной вызывает malloc(),
перемещая таблицу адресов из стека в сегмент данных. malloc
описывается в следующем разделе. Вся таблица перемещается в сегмент
данных.
                 ПРОГРАММА ДОСТУПА К ПЕРЕМЕННЫМ СРЕДЫ

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 extern char **environ;   /* system variable */
 5
 6 main(int argc, char *argv[], char *envp[])
 7 {
 8    void printenv(const char **);
 9
10    printenv(envp);
11    putenv("TZ=PST8PDT");
12    printenv(envp);
13    putenv("WARNING=Don't use envp after putenv()");
14    printenv(envp);
15    printf("value of WARNING is: %s\n", getenv("WARNING"));
16 }
17
18 void printenv(const char **envp)
19 {
20    char **p;
21
22    printf("envp contains %8x\n", envp);
23    printf("environ contains %8x\n", environ);
24
25    printf("My environment variables are:\n");
26 /* loop stops on encountering a pointer to a NULL address*/
27    for (p = environ; *p; p++)
28    printf ("(%8x) = %8x -> %s\n", p, *p, *p);
29    putchar('\n');
30 }