Skip to content

Home Программирование Модификация окружения: setenv(), putenv(), unsetenv()
Модификация окружения: setenv(), putenv(), unsetenv()

Чаще всего модификация окружения требуется при реализации многозадачности. Ранее уже говорилось о том, что дочерний процесс получает копию окружения своего родителя. Приведем пример. Некоторые программы читают языковую информацию (локаль) из переменной окружения lang. Этим можно воспользоваться. Если текущая локаль настроена на русский язык, то программа date, например, будет выводить примерно следующее:

$ date
Сбт Ноя 25 16:58:32 UTC 2006

Однако если изменить переменную окружения lang, to программа date унаследует ее от оболочки. Можно, например, вывести дату на английском, французском или даже на финском языке:

$ export LANG=en_US$ date
Sat Nov 25 17:00:23 UTC 2006
$ export LANG=fr_FR
$ date
sam nov 25 17:00:45 UTC 2006
$ export LANG=?i_FI
$ date
la marraskuun 25. 17:01:04 UTC 2006

Такие "трюки" возможны не везде, алишь в версиях Linux с языковой поддержкой. Но смысл в том, что дочернему процессу можно "подсунуть" любое окружение. Для этого даже не обязательно менять окружение оболочки. Передать программе модифицированное окружение можно при помощи уже знакомой нам программы env:

$ env LANG=fi_FI date
la marraskuun 25. 17:21:31 UTC 2006

На практике модификация окружения осуществляется функциями setenvO, putenv() и unsetenv(), которые объявлены в заголовочном файле stdlib.h.

int setenv (const char * NAME, const char * VALUE, int OV);

Функция setenvo добавляет новую или изменяет существующую переменную окружения с именем name, присваивая ей значение value, ov — это флаг перезаписи, показывающий, нужно ли перезаписывать переменную, если таковая существует. Если параметр ov не равен нулю, то переменная перезаписывается, в противном случае переменная остается нетронутой, setenvo возвращает 0 при успешном завершении и -1, если произошла ошибка.

int putenv (char * INITSTR);

Функция putenv о добавляет новую или заменяет существующую переменную окружения, используя строку инициализации initstr в формате переменная=значение. putenv о возвращает 0 при успешном завершении и -1, если произошла ошибка. Следует отметить, что функция putenv () реализована не во всех Unix-подобных системах, что может сказаться на переносимости.

int unsetenv (const char * NAME);

Функция unsetenv о удаляет переменную с именем name из окружения. Ранее функция unsetenv() ничего не возвращала, и лишь в glibc-2.2.2 все изменилось. В настоящее время unsetenv () возвращает 0 при успешном завершении или -1 — в случае ошибки.

Рассмотрим сначала пример, демонстрирующий работу функции setenvo

Пример setenvdemo.c

#include <stdlib.h>
#include <stdio.h>
int main (int argc, char ** argv)
{
int ov_flag = 1;
char * var;
if (argc < 3)
{
fprintf (stderr, "Too few arguments\n");
return 1;
}
setenv (argv[1], argv[2], ov_flag);
var = getenv (argv[1]);
if (var == NULL)
printf ("Variable %s doesn't exist\n", argv[1]);
else
printf ("%s=%s\n", argv[1], var);
return 0;
}

Приведенная программа читает два аргумента командной строки: имя переменной и ее значение. Особый интерес представляет переменная ov_fiag. Если присвоить ей нулевое значение, то поведение программы изменится: функция setenvo не будет перезаписывать уже существующие переменные окружения, унаследованные от командной оболочки.

Рассмотрим теперь пример использования putenv()

Пример putenvaemo.с

#include <stdlib.h>
#include <stdio.h>
int main (int argc, char ** argv)
{
char * var;
char initvar[1024];
if (argc < 3)
{
fprintf (stderr, "Too few arguments\n");
return 1;
}
sprintf (initvar, "%s=%s", argv[1], argv[2]);
putenv (initvar);
var = getenv (argv[1]);
if (var == NULL)
printf ("Variable %s doesn't exist\n", argv[1]);
else
printf ("%s=%s\n", argv[1], var);
return 0;

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

Теперь рассмотрим программу, работающую с функцией unsetenvo

Программа unsetenvdemo.с

#include <stdlib.h> 
#include <stdio.h>
extern char ** environ;
int main (int argc, char ** argv)
{
int i;
if (argc < 2)
{
fprintf (stderr, "Too few arguments'^");
return 1;
}
if (unsetenv (argv[1]) != 0) {
fprintf (stderr, "Cannot unset %s\n", argv[1]);
return 1;
}
for (i = 0; environ[i] != NULL; i++) printf ("%s\n", environ[i]);
return 0;
}

Эта программа удаляет из окружения переменную, переданную в качестве аргумента, а затем выводит на экран все окружение, через механизм просмотра массива environ. Таким образом можно убедиться, что переменная действительно удалена из окружения:

$ ./unsetenvdemo USER | grep USER $

Обратите внимание, что передача в функцию unsetenv о имени несуществующей переменной не считается ошибкой. Это говорит о том, что unsetenv() не обязуется, а только пытается удалить переменную из окружения. Другое дело, когда в имя переменной "вкрадывается", например, знак равенства:

$ ./unsetenvdemo USER=

В результате будет выдано сообщение

Cannot unset USER=

Поскольку знак равенства является служебным символом, функция unsetenv () выдала ошибку.

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top