В упражнении 4.4 вы напишeте программу для вывода значения любой выбранной вами переменной окружения. У вас также будет возможность задать значение, если вы укажете второй аргумент программы.
Упражнение 4.4. Функции getenv
и putenv
1. Первые несколько строк после объявления функции main
гарантируют корректный вызов программы environ.c с только одним или двумя аргументами:
#include
#include
#include
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 %s\n", var, value);
else
printf("Variable %s has no value\n", var);
3. Далее проверьте, был ли при вызове программы указан второй параметр. Если был, вы задаете значение этого аргумента, конструируя строку вида имя=значение
и затем вызывая функцию putenv
:
if (argc == 3) {
char *string;
value = argv[2];
string = malloc(strlen(var)+strlen(value)+2);
if (!string} {
fprintf(stderr, "out of memory\n");
exit(1);
}
strcpy(string, var);
strcat(string, "=");
strcat(string, value);
printf("Calling putenv with: %s\n", string);
if (putenv(string) != 0) {
fprintf(stderr, "putenv failed\n");
free(string);
exit(1);
}
4. В заключение вы узнаете новое значение переменной, вызвав функцию getenv еще раз:
value = getenv(var);
if (value)
printf("New value of %s is %s\n", 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
Обратите внимание на то, что окружение локально по отношению к программе. Изменения, которые вы делаете в программе, не отражаются вне ее, поскольку значения переменных не передаются из дочернего процесса (вашей программы) в родительский (командную оболочку).
Применение переменных окружения
Программы часто применяют переменные окружения для изменения способа своей работы. Пользователи могут задать значения этих переменных окружения либо в их стандартном окружении с помощью файла .profile, читаемого их регистрационной командной оболочкой, использующей специальный файл запуска (rc) оболочки, либо заданием переменных в командной строке командной оболочки. Например,
$ ./environ FRED
Variable FRED has no value
$ FRED=hello ./environ FRED
Variable FRED has value hello
Командная оболочка принимает начальные присвоения значений переменным как временные изменения переменных окружения. Во второй части предыдущего примера программа environ
выполняется в окружении, где у переменной FRED
есть значение.
Например, в будущей версии приложения, управляющего базой данных компакт-дисков, вы сможете изменить переменную окружения, скажем CDDB
, обозначающую базу данных, которую нужно использовать. Каждый пользователь затем сможет задать собственное значение по умолчанию или применить команду оболочки для задания значения при очередном выполнении приложения:
$ CDDB=mycds; export CDDB
$ cdapp
или
$ CDDB=mycds cdapp
Примечание
Переменные окружения — противоречивое благо, и их следует применять с осторожностью. Эти переменные более "закрыты" от пользователя, чем опции командной строки, и это может затруднить отладку. По смыслу переменные окружения подобны глобальным переменным, поэтому они могут изменять поведение программы, что порой приводит к неожиданным результатам.
Как вы уже знаете, окружение программы формируется из строк вида имя=значение. Этот массив строк становится доступен программе непосредственно из переменной environ, которая объявляется, как
#include
extern char **environ;
Выполните упражнение 4.5.
Упражнение 4.5. Переменная environ
Далее приведена программа showenv.c, использующая переменную environ для вывода переменных окружения.
Читать дальше