Linux программирование в примерах | страница 43
>setenv()
является более предпочтительной функцией.ЗАМЕЧАНИЕ. GNU >putenv()
имеет дополнительную (документированную) особенность в своем поведении. Если строка аргумента является именем без следующего за ним символа >=
, именованная переменная удаляется. Программа GNU >env
, которую мы рассмотрим далее в мой главе, полагается на такое поведение.
Функция >unsetenv()
удаляет переменную из окружения:
>unsetenv("PATH");
Наконец, функция >clearenv()
полностью очищает окружение:
>if (clearenv() != 0) {
> /* обработать ошибку */
>}
Эта функция не стандартизирована POSIX, хотя она доступна в GNU/Linux и нескольких коммерческих вариантах Unix. Ее следует использовать, если приложение должно быть очень безопасным и нужно построить собственное окружение с нуля. Если >clearenv()
недоступна, в справке GNU/Linux для clearenv(3) рекомендуется использовать для выполнения этой задачи '>environ = NULL
'.
2.4.2. Окружение в целом: >environ
Правильным способом работы с окружением является использование функций, описанных в предыдущем разделе. Однако, стоит взглянуть на то, как это работает «под капотом».
Внешняя переменная >environ
предоставляет доступ таким же способом, как >argv
предоставляет доступ к аргументам командной строки. Вы сами должны объявить переменную. Хотя она и стандартизирована POSIX, >environ
намеренно не объявлена ни в одном стандартном заголовочном файле (Это, кажется, прослеживается из исторической практики.) Вот объявление:
>extern char **environ; /* Смотрите, нет заголовочного файла POSIX */
Как и в >argv
, завершающим элементом >environ
является >NULL
. Однако, здесь нет переменной «числа строк окружения», которая соответствовала бы >argc
. Следующая простая программа распечатывает все окружение:
>/* ch02-printenv.c --- Распечатать окружение. */
>#include
>extern char **environ;
>int main(int argc, char **argv) {
> int i;
> if (environ != NULL)
> for (i = 0; environ[i] != NULL; i++)
> printf("%s\n", environ[i]);
> return 0;
>}
Хотя это и маловероятно, перед попыткой использовать >environ
эта программа проверяет, что она не равна >NULL
.
Переменные хранятся в окружении в случайном порядке. Хотя некоторые оболочки Unix хранят переменные окружения в отсортированном по именам переменных виде, это формально не требуется, и многие оболочки не сортируют их.
В качестве уловки реализации можно получить доступ к окружению, объявив третий параметр >main()
:
>int main(int argc, char **argv, char **envp) {