| Модификация окружения: setenv(), putenv(), unsetenv() |
|
Чаще всего модификация окружения требуется при реализации многозадачности. Ранее уже говорилось о том, что дочерний процесс получает копию окружения своего родителя. Приведем пример. Некоторые программы читают языковую информацию (локаль) из переменной окружения lang. Этим можно воспользоваться. Если текущая локаль настроена на русский язык, то программа date, например, будет выводить примерно следующее: $ date Однако если изменить переменную окружения lang, to программа date унаследует ее от оболочки. Можно, например, вывести дату на английском, французском или даже на финском языке: $ export LANG=en_US$ date Такие "трюки" возможны не везде, алишь в версиях Linux с языковой поддержкой. Но смысл в том, что дочернему процессу можно "подсунуть" любое окружение. Для этого даже не обязательно менять окружение оболочки. Передать программе модифицированное окружение можно при помощи уже знакомой нам программы env: $ env LANG=fi_FI date На практике модификация окружения осуществляется функциями 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> Приведенная программа читает два аргумента командной строки: имя переменной и ее значение. Особый интерес представляет переменная ov_fiag. Если присвоить ей нулевое значение, то поведение программы изменится: функция setenvo не будет перезаписывать уже существующие переменные окружения, унаследованные от командной оболочки. Рассмотрим теперь пример использования putenv() Пример putenvaemo.с #include <stdlib.h> Эта программа работает так же, как и setenvdemo с установленным флагом перезаписи. Очевидно, что в ситуациях, когда имя переменной окружения и ее значение хранятся в разных строках, всегда целесообразнее использовать setenv (). Теперь рассмотрим программу, работающую с функцией unsetenvo Программа unsetenvdemo.с #include <stdlib.h> Эта программа удаляет из окружения переменную, переданную в качестве аргумента, а затем выводит на экран все окружение, через механизм просмотра массива environ. Таким образом можно убедиться, что переменная действительно удалена из окружения: $ ./unsetenvdemo USER | grep USER $ Обратите внимание, что передача в функцию unsetenv о имени несуществующей переменной не считается ошибкой. Это говорит о том, что unsetenv() не обязуется, а только пытается удалить переменную из окружения. Другое дело, когда в имя переменной "вкрадывается", например, знак равенства: $ ./unsetenvdemo USER= В результате будет выдано сообщение Cannot unset USER= Поскольку знак равенства является служебным символом, функция unsetenv () выдала ошибку.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 371 Комментарии (0)RSS feed CommentsНаписать комментарий |