Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 63 64 65 66 67 68 69 70 71 ... 324

В спецификации UNIX определено множество стандартных переменных окружения, применяемых для самых разных целей, включая тип терминала, имена редакторов, установленных по умолчанию, названия часовых поясов и т.д. Программа на языке С может получить доступ к переменным окружения с помощью функций putenv и getenv.

<b>#include &lt;stdlib.h&gt;</b>

<b>char *getenv(const char *name);</b>

<b>int putenv(const char *string);</b>

Окружение состоит из строк вида имя=значение. Функция getenv ищет в окружении строку с заданным именем и возвращает значение, ассоциированное с этим именем. Она вернет NULL, если требуемая переменная не существует. Если переменная есть, но ее значение не задано, функция getenv завершится успешно и вернет пустую строку, в которой первый байт равен NULL. Строка, возвращаемая getenv, хранится в статической памяти, принадлежащей функции, поэтому для ее дальнейшего использования вы должны скопировать эту строку в другую, поскольку она может быть перезаписана при последующих вызовах функции getenv. 

Функция putenv принимает строку вида <i>имя=значение</i> и добавляет ее в текущее окружение. Она даст сбой и вернет -1, если не сможет расширить окружение из-за нехватки свободной памяти. Когда это произойдет, переменной errno будет присвоено значение ENOMEM.

В упражнении 4.4 вы напишeте программу для вывода значения любой выбранной вами переменной окружения. У вас также будет возможность задать значение, если вы укажете второй аргумент программы.

Упражнение 4.4. Функции getenv и putenv

1. Первые несколько строк после объявления функции main гарантируют корректный вызов программы environ.c с только одним или двумя аргументами:

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &lt;string.h&gt;

int main(int argc, char *argv[]) {

 char *var, *value;

 if (argc == 1 || argc &gt; 3) {

  fprintf(stderr, &quot;usage: environ var [value]n&quot;);

  exit(1);

 }

2. Сделав это, вы извлекаете значение переменной из окружения с помощью функции getenv:

 var = argv[1];

 value = getenv(var);

 if (value)

  printf(&quot;Variable %s has value %sn&quot;, var, value);

 else

  printf(&quot;Variable %s has no valuen&quot;, var);

3. Далее проверьте, был ли при вызове программы указан второй параметр. Если был, вы задаете значение этого аргумента, конструируя строку вида <i>имя=значение</i> и затем вызывая функцию putenv:

 if (argc == 3) {

  char *string;

  value = argv[2];

  string = malloc(strlen(var)+strlen(value)+2);

  if (!string} {

   fprintf(stderr, &quot;out of memoryn&quot;);

   exit(1);

  }

  strcpy(string, var);

  strcat(string, &quot;=&quot;);

  strcat(string, value);

  printf(&quot;Calling putenv with: %sn&quot;, string);

  if (putenv(string) != 0) {

   fprintf(stderr, &quot;putenv failedn&quot;);

   free(string);

   exit(1);

  }

4. В заключение вы узнаете новое значение переменной, вызвав функцию getenv еще раз:

  value = getenv(var);

  if (value)

   printf(&quot;New value of %s is %sn&quot;, var, value);

  else

   printf(&quot;New value of %s is null??n&quot;, var);

 }

 exit(0);

}

Когда вы выполните эту программу, то сможете увидеть и задать переменные окружения:

$ <b>./environ НОМЕ</b>

Variable HOME has value /home/neil

$ <b>./environ FRED</b>

Variable FRED has no value

$ <b>./environ FRED hello</b>

Variable FRED has no value

Calling putenv with: FRED=hello

New value of FRED is hello

$ <b>./environ FRED</b>

Variable FRED has no value

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

Применение переменных окружения

Программы часто применяют переменные окружения для изменения способа своей работы. Пользователи могут задать значения этих переменных окружения либо в их стандартном окружении с помощью файла .profile, читаемого их регистрационной командной оболочкой, использующей специальный файл запуска (rc) оболочки, либо заданием переменных в командной строке командной оболочки. Например,

$ <b>./environ FRED</b>

Variable FRED has no value

$ <b>FRED=hello ./environ FRED</b>

1 ... 63 64 65 66 67 68 69 70 71 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий