Здравствуйте, уважаемые подписчики! Этот выпуск рассылки научит вас использовать окружение в своих программах.
С момента последнего выпуска рассылки сайт Lindevel.Ru (http://lindevel.ru) сменил систему управления контентом с MOS 4.5.2 на e107. Сайт получил новое оформление, новые возможности и избавился от былых ошибок. Единственным недостатком перехода на другую CMS стала ликвидация всех пользовательских аккаунтов, зарегистрироованных до 15.09.2005, однако в течение двух месяцев на сайте будет действовать ускоренная система регистрации новых пользователей (без подтверждения по e-mail).
Все вопросы, касающиеся рассылки или программирования в Linux задавайте в форуме на Lindevel.Ru (http://lindevel.ru).
2. Программа
2.1. Описание
Сегодня мы рассмотрим программу, которая вызывается с двумя параметрами: один из них - имя переменной окружения, другой - значение этой переменной. Программа присваивает переменной значение и выводит отчет о проделанной работе.
Любой запущенный процесс в Linux обладает своим программным окружением. Чаще всего это независимая копия окружения родительского процесса. Для чтения или изменения переменных окружения в программах чаще всего используются функции getenv() и setenv(). Ниже представлены адаптированные прототипы этих функций:
char* getenv (const char* var);
int setenv (const char* var, const char* val, int order);
Функция getenv() возвращает значение переменной окружения var. Если getenv() возвращает NULL, значит переменная отсутствует в окружении.
Функция setenv() устанавливает значение для переменной окружения. Если переменная отсутствует в окружении, то будет создана. Аргумент var - имя переменной, аргумент val - вносимое значение. Если аргумент order не равен нулю, то существующая переменная перезаписывается, если order равен нулю и переменная существует в окружении, то ничего не происходит. В случае успешного завершения setenv() возвращает нулевое значение.
3.2. Другие функции работы с окружением
В Linux есть еще несколько функций для работы с окружением: это putenv(), unsetenv() и clearenv(). Эти функции используются редко, но их надо знать в лицо.
putenv() в принципе делает то же, что и setenv(), только другим способом (ее единственный аргумент - это строка в формате ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ). Я настоятельно рекомендую вам не использовать эту функцию в своих программах, поскольку она доступна не во всех Unix-системах.
Функция unsetenv() удаляет переменную из окружения. Ее единственный аргумент - это имя переменной.
Функция clearenv() вызывается без аргументов. Она очищает все окружение, однако доступна не во всех Unix-системах.
3.3. Использование таблицы окружения
Рассмотренные выше функции представляют собой безопасный способ работы с окружением. Однако программа может получить доступ к окружению через глобальный двумерный массив строк environ. Глобальное объявление
extern char** environ;
позволит вам читать окружение удобным для вас способом, однако я не рекомендую изменять environ методом непосредственной записи. Функция setenv() делает это правильно и безопасно. Однако инструкция
environ = NULL;
вполне безопасна и позволяет очистить все окружение, не заботясь о переносимости.
Массив environ часто называют таблицей окружения или просто окружением.
3.3. Окружение и функции exec()
Изучая основы многозадачности Linux мы обошли стороной изучение функций execXe(). Эти функции (execve() и execle()) запускают программу с модифицированным окружением. Последний аргумент каждой из этих функций - это окружение (массив environ) запускаемой программы.
4. Разбор полетов
Приведенный пример не содержит подводных камней, однако не стоит забывать, что у каждого процесса свое окружение, и окружение программы myvar никак не связано с окружением оболочки. Поэтому не удивляйтесь следующему поведению программы:
$ ./myenv MYVAR myvar-value
MYVAR: not defined
New value: myvar-value
$ echo $MYVAR
$
Этот выпуск завершает изучение темы "Программное окружение". Теперь будем изучать файлы. Полный архив рассылки доступен на сайте Lindevel.Ru (http://lindevel.ru).
До новых встреч.
Николай.
mailto: nnivanov@mail.ru
На сайте открыт Интернет-магазин, в котором вы можете приобрести по доступным ценам все, что нужно для программирования в Linux (дистрибутивы, книги и проч.)
В течение недели сайт существенно пополнится учебными материалами.