[<<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 }