Основы программирования в Linux - Страница 67
В спецификации UNIX определено множество стандартных переменных окружения, применяемых для самых разных целей, включая тип терминала, имена редакторов, установленных по умолчанию, названия часовых поясов и т.д. Программа на языке С может получить доступ к переменным окружения с помощью функций
putenvgetenv#include <stdlib.h>char *getenv(const char *name);int putenv(const char *string);Окружение состоит из строк вида имя=значение
getenvNULLgetenvNULLgetenvgetenvФункция
putenvимя=значениеerrnoENOMEMВ упражнении 4.4 вы напишeте программу для вывода значения любой выбранной вами переменной окружения. У вас также будет возможность задать значение, если вы укажете второй аргумент программы.
getenvputenv1. Первые несколько строк после объявления функции
main#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 FREDVariable FRED has no value$ ./environ FRED helloVariable FRED has no valueCalling putenv with: FRED=helloNew value of FRED is hello$ ./environ FREDVariable FRED has no valueОбратите внимание на то, что окружение локально по отношению к программе. Изменения, которые вы делаете в программе, не отражаются вне ее, поскольку значения переменных не передаются из дочернего процесса (вашей программы) в родительский (командную оболочку).
Применение переменных окружения
Программы часто применяют переменные окружения для изменения способа своей работы. Пользователи могут задать значения этих переменных окружения либо в их стандартном окружении с помощью файла .profile, читаемого их регистрационной командной оболочкой, использующей специальный файл запуска (rc) оболочки, либо заданием переменных в командной строке командной оболочки. Например,
$ ./environ FREDVariable FRED has no value$ FRED=hello ./environ FRED