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(), помещается непосредственно в окружение. Это означает, что если ваш код позже изменит эту строку (например, если это был массив, а не строковая константа), окружение также будет изменено. Это, в свою очередь, означает, что вам не следует использовать в качестве параметров для