Книга: Основы программирования в 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

Обратите внимание на то, что окружение локально по отношению к программе. Изменения, которые вы делаете в программе, не отражаются вне ее, поскольку значения переменных не передаются из дочернего процесса (вашей программы) в родительский (командную оболочку).

Оглавление книги


Генерация: 0.049. Запросов К БД/Cache: 0 / 2
поделиться
Вверх Вниз