- Что такое environ linux
- ОШИБКИ
- 2.4.2. Окружение в целом: environ
- Читайте также
- Глава 9 Системное окружение Linux
- 9.1. Окружение процесса
- 5.6. Параметры и переменные. Окружение оболочки
- Окружение
- Окружение
- Окружение и атмосферные эффекты
- Сокрытие пиктограммы Сетевое окружение на Рабочем столе
- 8.5. Окружение и атмосферные эффекты
- SMS: А в целом — фигня
- Изящество линии: что может стать «двигателем» бытовой электроники и ИТ-индустрии в целом в ближайшее время? Михаил Ваннах
- Тревожные прогнозы: рост мирового рынка ИТ отстает от роста мировой экономики в целом Михаил Ваннах
- 4.6.2. Действия с изображением в целом
- Сетевое окружение
- Зеркало цифр: Как соотносится российская отрасль программного обеспечения с состоянием экономики страны в целом? Михаил Ваннах
- environ(5) — Linux man page
- Synopsis
- Description
- Что такое environ linux
- 4.2. Массив environ
- 4.3. Чтение окружения: getenv()
- 4.4. Запись окружения: setenv()
- 4.5. Сырая модификация окружения: putenv()
- 4.6. Удаление переменной окружения: unsetenv()
- 4.7. Очистка окружения: clearenv()
Что такое environ linux
Вышеуказанные имена переменных могут быть помещены в окружение командой export и `имя=значение’ в sh (1), или командой setenv , если вы используете csh (1). При вызове exec (3). в окружение также могут быть помещены и аргументы. Программа, написанная на языке C может манипулировать своим окружением с помощью функций getenv (3), putenv (3), setenv (3), и unsetenv (3).
Заметим, что наличие или значения определённых переменных окружения может отказывать влияние на поведение многих программ и библиотечных вызовов. Вот случайная подборка:
Переменные LANG , LANGUAGE , NLSPATH , LOCPATH , LC_ALL , LC_MESSAGES , и т.д. влияют на управление региональными настройками, см. locale (5).
TMPDIR влияет на путь файлов, создаваемых вызовом tmpnam(3) и через некоторые другие вызовы, временный каталог также используется программой sort (1) и некоторыми другими, и т.д.
LD_LIBRARY_PATH , LD_PRELOAD и другие переменные LD_* влияют на поведение динамического загрузчика и редактора связей (компановщика).
POSIXLY_CORRECT делает поведение определённых программ и системных вызовов соответствующим POSIX.
На поведение malloc (3) оказывают влияние переменные MALLOC_*.
Переменная HOSTALIASES задаёт имя файла, содержащего псевдонимы имени узла, которые используются вызовом gethostbyname (3).
TZ и TZDIR задают информацию о временной зоне, используемую вызовом tzset (3) и такими функциями как ctime (), localtime (), mktime (), strftime (). См. также tzselect (1).
TERMCAP задаёт информацию о адресе терминала (или имя файла, содержащего такую информацию).
COLUMNS и LINES говорят приложению о размере окна, возможно перекрывая фактический размер.
PRINTER и LPDEST могут задавать предпочтительный принтер. См. lpr (1).
ОШИБКИ
Также есть риск с загрязнением пространства имен. Такие программы как make и autoconf позволяют перекрывать имена назначенных по умолчанию утилит, через переменные окружения. Например, переменная CC используется для выбора нужного C-компилятора (и похожим образом можно использовать переменные MAKE , AR , AS , FC , LD , LEX , RM , YACC , и т.д.) Однако, в некоторых традиционных случаях, эти переменные окружения задают опции для данных программ, вместо их имени. Например MORE , LESS , и GZIP . Такое использование переменных окружения является ошибочным и будет избегаться в новых программах. Авторы gzip должны бы переименовать переменную в GZIP_OPT .
Источник
2.4.2. Окружение в целом: environ
2.4.2. Окружение в целом: environ
Правильным способом работы с окружением является использование функций, описанных в предыдущем разделе. Однако, стоит взглянуть на то, как это работает «под капотом».
Внешняя переменная environ предоставляет доступ таким же способом, как argv предоставляет доступ к аргументам командной строки. Вы сами должны объявить переменную. Хотя она и стандартизирована POSIX, environ намеренно не объявлена ни в одном стандартном заголовочном файле (Это, кажется, прослеживается из исторической практики.) Вот объявление:
extern char **environ; /* Смотрите, нет заголовочного файла POSIX */
Как и в argv, завершающим элементом environ является NULL. Однако, здесь нет переменной «числа строк окружения», которая соответствовала бы argc. Следующая простая программа распечатывает все окружение:
/* ch02-printenv.c — Распечатать окружение. */
extern char **environ;
int main(int argc, char **argv) <
if (environ != NULL)
for (i = 0; environ[i] != NULL; i++)
Хотя это и маловероятно, перед попыткой использовать environ эта программа проверяет, что она не равна NULL.
Переменные хранятся в окружении в случайном порядке. Хотя некоторые оболочки Unix хранят переменные окружения в отсортированном по именам переменных виде, это формально не требуется, и многие оболочки не сортируют их.
В качестве уловки реализации можно получить доступ к окружению, объявив третий параметр main():
int main(int argc, char **argv, char **envp) <
Затем можно использовать envp также, как environ. Хотя это иногда можно увидеть в старом коде, мы не рекомендуем такое использование; environ является официальным, стандартным, переносимым способом получения доступа ко всему окружению, если это вам необходимо.
Читайте также
Глава 9 Системное окружение Linux
Глава 9 Системное окружение Linux В этой главе рассматривается процесс запроса системных служб, включая низкоуровневые средства ядра и высокоуровневые возможности
9.1. Окружение процесса
9.1. Окружение процесса Как подробно описано в главе 10, в каждом выполняющемся процессе есть переменные окружения. Переменные окружения представляют собой пары «имя-значение», и некоторые из них представляют ценность для программистов на языке С. (Многие переменные в
5.6. Параметры и переменные. Окружение оболочки
5.6. Параметры и переменные. Окружение оболочки Понятие параметра в оболочке bash подобно понятию переменной в обычных языках программирования. Именем (или идентификатором) параметра может быть слово, состоящее из алфавитных символов, цифр и знаков подчеркивания (только
Окружение
Окружение Окружение системы образуют все факторы, которые сами по себе фактически не являются частью сервера, но тем не менее играют важную роль в формировании ожидаемых от системы надежности и качества. Электропитание, температура и влажность помещения, источники
Окружение
Окружение Следующий стратегический момент, который я хочу до вас довести. Хотите стать успешным в бизнесе – найдите возможность регулярно общаться с успешными людьми. Лучше всего завести себе друзей бизнесменов и миллионеров. Итак, вам надо изыскивать возможности
Окружение и атмосферные эффекты
Окружение и атмосферные эффекты Использование Environment (Окружающая среда) и Effects (Эффекты) позволяет создавать общее настроение, повышая реалистичность сцены. Элементы управления атмосферой предлагают широкий набор эффектов, включая туман, дымку, огонь, дым и т. д.Окно
Сокрытие пиктограммы Сетевое окружение на Рабочем столе
Сокрытие пиктограммы Сетевое окружение на Рабочем столе Ключ:[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorer] Значение:
8.5. Окружение и атмосферные эффекты
8.5. Окружение и атмосферные эффекты Использование Environment (Окружающая среда) и Effects (Эффекты) позволяет создавать общее настроение, повышая реалистичность сцены. Элементы управления атмосферой предлагают широкий набор эффектов, включая туман, дымку, огонь, дым и т. д.Окно
SMS: А в целом — фигня
SMS: А в целом — фигня Подведем итоги SMS-рейтинга материалов в последних пяти номерах. Промежуточных оценок немного, в основном двойки (единицы) и пятерки. Некоторые статьи попали в разные группы одновременно.ПятеркаАлексей Коновалов, «Хладокомбинат»Бёрд Киви, «Битва
Изящество линии: что может стать «двигателем» бытовой электроники и ИТ-индустрии в целом в ближайшее время? Михаил Ваннах
Изящество линии: что может стать «двигателем» бытовой электроники и ИТ-индустрии в целом в ближайшее время? Михаил Ваннах Опубликовано 02 июля 2013 Есть одна греко-римская легенда. Будто бы, когда пылал дворец Юлия Цезаря на Палатине, там погибла
Тревожные прогнозы: рост мирового рынка ИТ отстает от роста мировой экономики в целом Михаил Ваннах
Тревожные прогнозы: рост мирового рынка ИТ отстает от роста мировой экономики в целом Михаил Ваннах Опубликовано 10 июля 2013 Международный валютный фонд (МВФ) — организация, склонная скорее к оптимизму. И особенно интересно смотреть на его прогнозы
4.6.2. Действия с изображением в целом
4.6.2. Действия с изображением в целом Для осуществления действий над изображением в целом не требуется его предварительно выделять, используя инструменты выбора, а если область выделения уже определена, то команда все равно распространяется целиком на всю
Сетевое окружение
Сетевое окружение Честно сказать, словосочетание настораживает. Можно подумать, что нас окружили, да еще с сетями (чтоб точно не сбежали). На самом деле это название системной папки, которая помогает нам работать с сетью. Так, если у вас дома, например, стоят два компьютера
Зеркало цифр: Как соотносится российская отрасль программного обеспечения с состоянием экономики страны в целом? Михаил Ваннах
Зеркало цифр: Как соотносится российская отрасль программного обеспечения с состоянием экономики страны в целом? Михаил Ваннах Опубликовано 26 февраля 2013О том, что в стране весьма динамично и вполне наблюдаемо развивается отрасль экспорта программного обеспечения, мы
Источник
environ(5) — Linux man page
environ — user environment
Synopsis
Description
The variable environ points to an array of strings called the ‘environment’. (This variable must be declared in the user program, but is declared in the header file unistd.h in case the header files came from libc4 or libc5, and in case they came from glibc and _GNU_SOURCE was defined.) This array of strings is made available to the process by the exec(3) call that started the process. By convention these strings have the form ‘name=value‘. Common examples are: USER
The name of the logged-in user (used by some BSD-derived programs). LOGNAME The name of the logged-in user (used by some System-V derived programs). HOME
A user’s login directory, set by login(1) from the password file passwd(5).
The name of a locale to use for locale categories when not overridden by LC_ALL or more specific environment variables like LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME, cf. locale(5).
The sequence of directory prefixes that sh(1) and many other programs apply in searching for a file known by an incomplete path name. The prefixes are separated by ‘:‘. (Similarly one has CDPATH used by some shells to find the target of a change directory command, MANPATH used by man(1) to find manual pages, etc.)
The current working directory. Set by some shells.
The file name of the user’s login shell.
The terminal type for which output is to be prepared.
The user’s preferred utility to display text files. EDITOR/VISUAL The user’s preferred utility to edit text files. BROWSER The user’s preferred utility to browse URLs. Sequence of colon-separated browser commands. See http://www.catb.org/
esr/BROWSER/ . Further names may be placed in the environment by the export command and ‘name=value’ in sh(1), or by the setenv command if you use csh(1). Arguments may also be placed in the environment at the point of an exec(3). A C program can manipulate its environment using the functions getenv(3), putenv(3), setenv(3), and unsetenv(3).
Note that the behaviour of many programs and library routines is influenced by the presence or value of certain environment variables. A random collection:
The variables LANG, LANGUAGE, NLSPATH, LOCPATH, LC_ALL, LC_MESSAGES, etc. influence locale handling, cf. locale(5).
TMPDIR influences the path prefix of names created by tmpnam(3) and other routines, the temporary directory used by sort(1) and other programs, etc.
LD_LIBRARY_PATH, LD_PRELOAD and other LD_* variables influence the behaviour of the dynamic loader/linker.
POSIXLY_CORRECT makes certain programs and library routines follow the prescriptions of POSIX.
The behaviour of malloc(3) is influenced by MALLOC_* variables.
The variable HOSTALIASES gives the name of a file containing aliases to be used with gethostbyname(3).
TZ and TZDIR give time zone information used by tzset(3) and through that by functions like ctime(), localtime(), mktime(), strftime(). See also tzselect(1).
TERMCAP gives information on how to address a given terminal (or gives the name of a file containing such information).
COLUMNS and LINES tell applications about the window size, possibly overriding the actual size.
PRINTER or LPDEST may specify the desired printer to use. See lpr(1).
Clearly there is a security risk here. Many a system command has been tricked into mischief by a user who specified unusual values for IFS or LD_LIBRARY_PATH.
There is also the risk of name space pollution. Programs like make and autoconf allow overriding of default utility names from the environment with similarly named variables in all caps. Thus one uses CC to select the desired C compiler (and similarly MAKE, AR, AS, FC, LD, LEX, RM, YACC, etc.). However, in some traditional uses such an environment variable gives options for the program instead of a pathname. Thus, one has MORE, LESS, and GZIP. Such usage is considered mistaken, and to be avoided in new programs. The authors of gzip should consider renaming their option to GZIP_OPT.
Источник
Что такое environ linux
Окружение (environment) или среда — это набор пар ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ, доступный каждому пользовательскому процессу. Иными словами, окружение — это набор переменных окружения. Если вы используете оболочку, отличную от bash, то не все примеры этой главы могут быть воспроизведены.
Для того, чтобы посмотреть окружение, просто введите команду env без аргументов. В зависимости от конфигурации системы, вывод env может занять несколько экранов, поэтому лучше сделать так: Или так: Или так:
Переменные окружения могут формироваться как из заглавных, так и из строчных символов, однако исторически сложилось именовать их в верхнем регистре. Мы также не будем отступать от этого неписанного правила.
Про полезность окружения можно говорить долго, но основное его назначение — заставить одни и те же программы работать у разных пользователей по-разному. Приятно, например, когда программа «угадывает» имя пользователя или домашний каталог пользователя. Чаще всего такая информация «добывается» из переменных окружения USER и HOME соответственно.
Значение каждой переменной окружения изначально представляет собой строковую константу (строку). Интерпретация значений переменных полностью возлагается на программу. Иными словами, все переменные окружения имеют тип char*, а само окружение имеет тип char**. Чтобы вывести на экран значение какой-нибудь переменной окружения, достаточно набрать echo $ИМЯ_ПЕРЕМЕННОЙ: Вообще говоря, при работе с оболочкой bash, запись $ИМЯ_ПЕРЕМЕННОЙ заменяется на само значение переменной, если только эта запись не встречается в кавычках, апострофах или в комментариях. В моем случае, например, запись $HOME заменяется на /home/nn. То есть команда mkdir $HOME/mynewdir создаст в моем домашнем каталоге подкаталог mynewdir.
В разных системах и у разных пользователей окружение отличается не только значениями переменных, но и наличием/отсутствием этих переменных. Пользователи, использующие универсальные MUA (Mail User Agent), наподобие Mozilla-mail, Kmail или Sylpheed вряд ли будут иметь в своем окружении (по крайней мере с пользой) переменные MAIL или MAILDIR. А пользователям mutt, pine или elm (с довесками в виде fetchmail/getmail, procmail и проч.) эти переменные жизненно необходимы. Пользователь, не использующий графические оболочки, вряд ли будет иметь в своем окружении переменную QTDIR. Ниже приведены те переменные окружения, которые есть почти у всех пользователей Linux:
- USER — имя текущего пользователя
- HOME — путь к домашнему каталогу текущего пользователя
- PATH — список каталогов, разделенных двоеточиями, в которых производится «поиск» программ
- PWD — текущий каталог
- OLDPWD — предыдущий текущий каталог
- TERM — тип терминала
- SHELL — текущая командная оболочка
Некоторые переменные окружения имеются не во всех системах, но все-таки требуют упоминания:
- HOSTNAME — имя машины
- QTDIR — расположение библиотеки QT
- MAIL — почтовый ящик
- LD_LIBRARY_PATH — место «поиска» дополнительных библиотек (см. предыдущую главу)
- MANPATH — место поиска файлов man-страниц (каталоги, разделенные двоеточием)
- LANG — язык и кодировка пользователя (иногда LANGUAGE)
- DISPLAY — текущий дисплей в X11
Помимо переменных окружения, командные оболочки, такие как bash располагают собственным набором пар ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Это переменные оболочки. Набор таких переменных называют окружением (или средой) оболочки. Эти переменные чем-то напоминают локальные (стековые) переменные в языке C. Они недоступны для других программ (в том числе и для env) и используются в основном в сценариях оболочки. Чтобы задать переменную оболочки, достаточно написать в командной строке ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Однако, при желании, можно включить локальную переменную оболочки в основное окружение. Для этого используется команда export: Можно сделать сразу так: Прежде, чем продолжать дальше, попробуйте поиграться с переменными окружения, чтобы лучше все понять. Выясните экспериментальным путем, чувствительны ли к регистру символов переменные окружения; можно ли использовать в качестве значений переменных окружения строки, содержащие пробелы; если можно, то как?
Теперь разберемся с тем, откуда берется окружение. Любая запущенная и работающая в Linux программа — это процесс. Запуская дважды одну и ту же программу, вы получаете два процесса. У каждого процесса (кроме init) есть свой процесс-родитель. Когда вы набираете в командной строке vim, в системе появляется новый процесс, соотвествующий текстовому редактору vim; родительским процессом здесь будет оболочка (bash, например). Для самой оболочки новый процесс будет дочерним. Мы будем подробно изучать процессы в последующих главах книги. Сейчас же важно одно: новый процесс получает копию родительского окружения. Из этого правила существует несколько исключений, но мы пока об этом говорить не будем. Важно то, что у кажного процесса своя независимая копия окружения, с которой процесс может делать все что угодно. Если процесс завершается, то копия теряется; если процесс породил другой, дочерний процесс, то этот новый процесс получает копию окружения своего родителя. Мы еще неоднократно столкнемся с окружением при изучении многозадачности.
4.2. Массив environ
Теперь, когда мы разобрались, что такое окружение, самое время написать программу для взаимодействия с окружением. Чтобы показать, как это все работает, сначала изобретем велосипед.
В заголовочном файле unistd.h объявлен внешний двумерный массив environ: В этом массиве хранится копия окружения процесса. Точка.
Массив не константный, но я не рекомендую вам изменять его — это опасно (для программы) и является плохим стилем программирования. Для изменения environ есть специальные механизмы, которые мы рассмотрим чуть позже. Уверен, что настоящие будущие хакеры прочитают это и сделают с точностью до «наоборот».
А читать environ нам никто не запрещал. Напишем одноименную программу (environ), которой в качестве аргумента передается имя переменной. Программа будет проверять, существует ли эта переменная в окружении; и если существует, то каково ее значение. Как мы позже узнаем, это можно было бы сделать значительно проще. Но я предупредил: мы изобретаем велосипед. Вот эта программа: А вот Makefile для этой программы (если нужен): Проверяем:
В приведенном примере мы осуществили простой синтаксический анализ массива environ, так как переменные и значения представлены в нем в обычном виде (ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ). К счастью нам больше не придется осуществлять синтаксический разбор массива environ. О настоящем предназначении этого массива будет рассказано в главе, посвященной многозадачности.
4.3. Чтение окружения: getenv()
В заголовочном файле stdlib.h объявлена функция getenv , которая доказывает, что в предыдущем примере мы изобрели велосипед. Ниже приведен адаптированный прототип этой функции.
Функция эта работает очень просто: если в качестве аргумента указано имя существующей переменной окружения, то функция возвращает указатель на строку, содержащую значение этой переменной; если переменная отсутствует, возвращается NULL.
Как видим, функция getenv() позволяет не осуществлять синтаксический разбор environ. Напишем новую программу, которая делает то же, что и предыдущая, только более простым способом. Назовем ее getenv по имени функции — виновника торжества.
4.4. Запись окружения: setenv()
Пришла пора модифицировать окружение! Еще раз напоминаю: каждый процесс получает не доступ к окружению, а копию окружения родительского процесса (в нашем случае это командная оболочка). Чтобы добавить в окружение новую переменную или изменить существующую, используется функция setenv, объявленная в файле stdlib.h. Ниже приведен адаптированный прототип этой функции.
Если хотите узнать, что значит «адаптированный прототип», загляните в /usr/include/stdlib.h на объявления функций getenv() и setenv() и больше не спрашивайте 😉
Функция setenv() устанавливает значение (второй аргумент, value) для переменной окружения (первый аргумент, name). Третий аргумент — это флаг перезаписи. При ненулевом флаге уже существующая переменная перезаписывается, при нулевом флаге переменная, если уже существует, — не перезаписывается. В случае успешного завершения setenv() возвращает нуль (даже если существующая переменная не перезаписалась при overwrite==0). Если в окружении нет места для новой переменной, то setenv() возвращает -1.
Наша новая программа setenv читает из командной строки два аргумента: имя переменной и значение этой переменной. Если переменная не может быть установлена, выводится ошибка, если ошибки не произошло, выводится результат в формате ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Вот эта программа:
Изменяя константу FL_OVWR можно несколько изменить поведение программы по отношению к существующим переменным окружения. Еще раз напоминаю: у каждого процесса своя копия окружения, которая уничтожается при завершении процесса. Экспериментируйте!
4.5. Сырая модификация окружения: putenv()
Функция putenv(), объявленная в заголовочном файле stdlib.h вызывается с единственным аргументом — строкой формата ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ или просто ПЕРЕМЕННАЯ. Обычно такие преформатированные строки называют запросами. Если переменная отсутствует, то в окружение добавляется новая запись. Если переменная уже существует, то текущее значение перезаписывается. Если в качестве аргумента фигурирует просто имя переменной, то переменная удаляется из окружения. В случае удачного завершения, putenv() возвращает нуль и -1 — в случае ошибки.
У функции putenv() есть одна особенность: указатель на строку, переданный в качестве аргумента, становится частью окружения. Если в дальнейшем строка будет изменена, будет изменено и окружение. Это очень важный момент, о котором не следует забывать. Ниже приведен адаптированный прототип функции putenv:
Теперь напишем программу, использующую putenv(). Вот она:
Программа немного сложнее тех, что приводились ранее, поэтому разберем все по порядку. Сначала создаем для удобства функцию print_evar (PRINT Environment VARiable), которая будет отражать текущее состояние переменной окружения, переданной в качестве аргумента. В функции main() перво-наперво выделяем в куче (heap) память для буфера, в который будут помещаться запросы; заносим адрес буфера в query_str. Теперь формируем строку, и посылаем запрос в функцию putenv(). Здесь нет ничего необычного. Дальше идет демонстрация того, на чем я акцентировал внимание: простое изменение содержимого памяти по адресу, хранящемуся в query_str приводит к изменению окружения; это видно из вывода функции print_evar(). Наконец, вызываем putenv() со строкой, не содержащей символа ‘=’ (равно). Это запрос на удаление переменной из окружения. Функция print_evar() подтверждает это.
Хочу заметить, что putenv() поддерживается не всеми версиями Unix. Если нет крайней необходимости, лучше использовать setenv() для пополнения/модификации окружения.
4.6. Удаление переменной окружения: unsetenv()
Функция unsetenv(), объявленная в stdlib.h, удаляет переменную из окружения. Ниже приведен адаптированный прототип этой функции.
Прежде всего хочу обратить внимание на то, что раньше функция unsetenv() ничего не возращала (void). С выходом версии 2.2.2 библиотеки glibc (январь 2001 года) функция стала возвращать int.
Функция unsetenv() использует в качестве аргумента имя переменной окружения. Возвращаемое значение — нуль при удачном завершении и -1 в случае ошибки. Рассмотрим простую программу, которая удаляет переменную окружения USER (. ). Для тех, кто испугался, напоминаю еще один раз: каждый процесс работает с собственной копией окружения, никак не связанной с копиями окружения других процессов, за исключением дочерних процессов, которых у нас нет. Ниже приведен исходный код программы, учитывающий исторические изменения прототипа функции unsetenv().
В программе показан один из самых варварских способов подстроить код под версию библиотеки. Это сделано исключительно для демонстрации двух вариантов unsetenv(). Никогда не делайте так в реальных программах. Намного проще и дешевле (в плане времени), не получая ничего от unsetenv() проверить факт удаления переменной при помощи getenv().
4.7. Очистка окружения: clearenv()
Функция clearenv(), объявленная в заголовочном файле stdlib.h, используется крайне редко для полной очистки окружения. clearenv() поддерживается не всеми версиями Unix. Ниже приведен ее прототип.
При успешном завершении clearenv() возвращает нуль. В случае ошибки возвращается ненулевое значение.
В большинстве случаев вместо clearenv() можно использовать следующую инструкцию:
Источник