Linux программирование в примерах | страница 42
> const char *value, /* окружения */
> int overwrite);
>int putenv(char *string); /* XSI: Установить переменную
> окружения, использует строку */
>void unsetenv(const char *name); /* POSIX: Удалить переменную
> окружения */
>int clearenv(void); /* Общее: очистить все окружение */
Функция >getenv()
— та, которую вы будете использовать в 99% случаев. Ее аргументом является имя переменной окружения, которую нужно искать, такое, как «>НОМЕ
» или «>PATH
». Если переменная существует, >getenv()
возвращает указатель на строковое значение. Если нет, возвращается >NULL
. Например:
>char *pathval;
>/* Поиск PATH; если нет, использовать значение
> по умолчанию */
>if ((pathval = getenv("PATH")) == NULL)
> pathval = "/bin:/usr/bin:/usr/ucb";
Иногда переменная окружения существует, но с пустым значением. В этом случае возвращаемое значение не равно >NULL
, но первый символ, на которую оно указывает, будет нулевым байтом, который в С является символом конца строки, '>\0
'. Ваш код должен позаботиться проверить, что возвращаемое значение не равно NULL. Если оно не >NULL
, необходимо также проверить, что строка не пустая, если вы хотите для чего-то использовать значение переменной. В любом случае, не используйте возвращенное значение слепо.
Для изменения переменной окружения или добавления к окружению еще одной используется >setenv()
:
>if (setenv("PATH", "/bin:/usr/bin:/usr/ucb", 1) != 0) {
> /* обработать ошибку */
>}
Возможно, что переменная уже существует в окружении. Если третий аргумент равен true (не ноль), новое значение затирает старое. В противном случае, предыдущее значение не меняется. Возвращаемое значение равно -1, если для новой переменной не хватило памяти, и 0 в противном случае. >setenv()
для сохранения в окружении делает индивидуальные копии как имени переменной, так и нового ее значения
Более простой альтернативой >setenv()
является >putenv()
, которая берет одну строку «>имя=значение
» и помещает ее в окружение:
>if (putenv("PATH=/bin:/usr/bin:/usr/ucb") != 0) {
> /* обработать ошибку */
>}
>putenv()
слепо заменяет любые предшествующие значения для той же переменной. А также, и это, возможно, более важно, строка, переданная >putenv()
, помещается непосредственно в окружение. Это означает, что если ваш код позже изменит эту строку (например, если это был массив, а не строковая константа), окружение также будет изменено. Это, в свою очередь, означает, что вам не следует использовать в качестве параметров для