Приведем пример программы, соответствующую стандарту POSIX.1, которая выводит значения всех аргументов, переданных функции
#include
extern char **environ;
main(int argc, char *argv[]) {
int i;
printf("число параметров, переданных программе %s равно %d\n",
argv[0], argc-1);
for (i=1; i
if (environ[i] != NULL)
printf("environ[%d] : %s\n", i, environ[i]);
}
В результате компиляции будет создан исполняемый файл программы (по умолчанию a.out). Запустив его, мы увидим следующую информацию:
$ a.out first second 3
число параметров, переданных программе a.out равно 3
argv[1] = first
argv[2] = second
argv[3] = 3
environ[0] : LOGNAME=andy
environ[1] : MAIL=/var/mail/andy
environ[2] : LD_LIBRARY_PATH=/usr/openwin/lib:/usr/ucblib
environ[3] : PAGER=/usr/bin/pg
environ[4] : TERM=vt100
environ[5] : PATH=/usr/bin:/bin:/etc:/usr/sbin:/sbin:/usr/ccs/bin:/usr/local/bin
environ[6] : HOME=/home/andy
environ[7] : SHELL=/usr/local/bin/bash
Максимальный объем памяти для хранения параметров и переменных окружения программы ограничен величиной ARG_MAX
, определенной в файле
Для получения и установки значений конкретных переменных окружения используются две функции:
#include
char *getenv(const char *name);
возвращает значение переменной окружения name
, a
int putenv(const char *string);
помещает переменную и ее значение (var_name=var_value
) в окружение программы.
В качестве примера приведем программу, похожую по своей функциональности на предыдущую, которая выборочно выводит значения переменных и устанавливает новые значения по желанию пользователя.
#include
#include
#include
main(int argc, char *argv[]) {
char *term;
char buf[200], var[200];
/* Проверим, определена ли переменная TERM */
if ((term = getenv("TERM")) == NULL)
/* Если переменная не определена, получим от пользователя ее значение и
поместим переменную в окружение программы */
{
printf("переменная TERM не определена, введите значение: ");
putenv(var);
} else
/* Если переменная TERM определена, предоставим пользователю возможность
изменить ее значение, после чего поместим ее в окружение процесса */
{
printf("TERM=%s. Change? [N]", getenv("TERM"));
gets(buf);
if (buf[0] == 'Y' || buf[0] == 'y') {
printf("TERM=");
gets{buf);
sprintf(var, "TERM=%s", buf);
putenv(var);
printf("new %s\n", var);
}
}
}
Сначала программа проверяет, определена ли переменная TERM
. Если переменная TERM
не определена, пользователю предлагается ввести ее значение. Если же переменная TERM
определена, пользователю предлагается изменить ее значение, после чего новое значение помещается в окружение программы.
Запуск этой программы приведет к следующим результатам:
$ а.out
TERM=ansi. Change? [N]y
TERM=vt100
new TERM=vt100
$
К сожалению, введенное значение переменной будет действительно только для данного процесса и порожденных им процессов: если после завершения программы a.out вывести значение TERM
, то видно, что оно не изменилось:
$ echo $TERM
ansi
$
Наследование окружения программы мы обсудим в разделе "Создание и управление процессами" далее в этой главе.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии