Книга: Основы программирования в Linux
Переменные окружения
Мы обсуждали переменные окружения в главе 2. Это переменные, которые могут использоваться для управления поведением сценариев командной оболочки и других программ. Вы также можете применять их для настройки пользовательской среды. Например, у каждого пользователя есть переменная окружения HOME
, определяющая его исходный каталог, стандартное место старта его или ее сеанса. Как вы видели, просмотреть переменные окружения можно из строки приглашения командной оболочки:
$ echo $НOМЕ
/home/neil
Вы также можете воспользоваться командой оболочки set
для получения списка всех переменных окружения.
В спецификации UNIX определено множество стандартных переменных окружения, применяемых для самых разных целей, включая тип терминала, имена редакторов, установленных по умолчанию, названия часовых поясов и т.д. Программа на языке С может получить доступ к переменным окружения с помощью функций putenv
и getenv
.
#include <stdlib.h>
char *getenv(const char *name);
int putenv(const char *string);
Окружение состоит из строк видаимя=значение
. Функция getenv
ищет в окружении строку с заданным именем и возвращает значение, ассоциированное с этим именем. Она вернет NULL
, если требуемая переменная не существует. Если переменная есть, но ее значение не задано, функция getenv
завершится успешно и вернет пустую строку, в которой первый байт равен NULL
. Строка, возвращаемая getenv
, хранится в статической памяти, принадлежащей функции, поэтому для ее дальнейшего использования вы должны скопировать эту строку в другую, поскольку она может быть перезаписана при последующих вызовах функции getenv
.
Функция putenv
принимает строку вида имя=значение
и добавляет ее в текущее окружение. Она даст сбой и вернет -1, если не сможет расширить окружение из-за нехватки свободной памяти. Когда это произойдет, переменной errno
будет присвоено значение ENOMEM
.
В упражнении 4.4 вы напишeте программу для вывода значения любой выбранной вами переменной окружения. У вас также будет возможность задать значение, если вы укажете второй аргумент программы.
Упражнение 4.4. Функции getenv
и putenv
1. Первые несколько строк после объявления функции main
гарантируют корректный вызов программы environ.c с только одним или двумя аргументами:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *var, *value;
if (argc == 1 || argc > 3) {
fprintf(stderr, "usage: environ var [value]n");
exit(1);
}
2. Сделав это, вы извлекаете значение переменной из окружения с помощью функции getenv
:
var = argv[1];
value = getenv(var);
if (value)
printf("Variable %s has value %sn", var, value);
else
printf("Variable %s has no valuen", var);
3. Далее проверьте, был ли при вызове программы указан второй параметр. Если был, вы задаете значение этого аргумента, конструируя строку вида имя=значение
и затем вызывая функцию putenv
:
if (argc == 3) {
char *string;
value = argv[2];
string = malloc(strlen(var)+strlen(value)+2);
if (!string} {
fprintf(stderr, "out of memoryn");
exit(1);
}
strcpy(string, var);
strcat(string, "=");
strcat(string, value);
printf("Calling putenv with: %sn", string);
if (putenv(string) != 0) {
fprintf(stderr, "putenv failedn");
free(string);
exit(1);
}
4. В заключение вы узнаете новое значение переменной, вызвав функцию getenv еще раз:
value = getenv(var);
if (value)
printf("New value of %s is %sn", var, value);
else
printf("New value of %s is null??n", var);
}
exit(0);
}
Когда вы выполните эту программу, то сможете увидеть и задать переменные окружения:
$ ./environ НОМЕ
Variable HOME has value /home/neil
$ ./environ FRED
Variable FRED has no value
$ ./environ FRED hello
Variable FRED has no value
Calling putenv with: FRED=hello
New value of FRED is hello
$ ./environ FRED
Variable FRED has no value
Обратите внимание на то, что окружение локально по отношению к программе. Изменения, которые вы делаете в программе, не отражаются вне ее, поскольку значения переменных не передаются из дочернего процесса (вашей программы) в родительский (командную оболочку).
- Использование переменной окружения ISC_PATH
- 22.3.3. Переменные окружения
- 14.4.2. Хранение переменных окружения в виде массива или хэша
- 15.4.2.1. Добавляйте отладочные опции и переменные
- Глава 2 Аргументы, опции и переменные окружения
- 2.4. Переменные окружения
- 13.2.1. Категории локалей и переменные окружения
- 15.4.2.2. Используйте специальные переменные окружения
- Где устанавливаются переменные окружения
- 10.4.2. Пользовательские переменные окружения
- 10.4. Переменные окружения
- 10.4.1. Системные переменные окружения