Функции управления окружением — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Функции управления окружением

2021-01-29 113
Функции управления окружением 0.00 из 5.00 0 оценок
Заказать работу

 

Несколько функций позволяют получать значения переменных окружения, изменять эти значения или удалять их. Вот соответствующие объявления:

 

Функция – та, которую вы будете использовать в 99% случаев. Ее аргументом является имя переменной окружения, которую нужно искать, такое, как «» или «». Если переменная существует, возвращает указатель на строковое значение. Если нет, возвращается. Например:

 

Иногда переменная окружения существует, но с пустым значением. В этом случае возвращаемое значение не равно, но первый символ, на которую оно указывает, будет нулевым байтом, который в С является символом конца строки, ''. Ваш код должен позаботиться проверить, что возвращаемое значение не равно NULL. Если оно не, необходимо также проверить, что строка не пустая, если вы хотите для чего‑то использовать значение переменной. В любом случае, не используйте возвращенное значение слепо.

Для изменения переменной окружения или добавления к окружению еще одной используется:

 

Возможно, что переменная уже существует в окружении. Если третий аргумент равен true (не ноль), новое значение затирает старое. В противном случае, предыдущее значение не меняется. Возвращаемое значение равно ‑1, если для новой переменной не хватило памяти, и 0 в противном случае. для сохранения в окружении делает индивидуальные копии как имени переменной, так и нового ее значения

Более простой альтернативой является, которая берет одну строку «имя значение» и помещает ее в окружение:

 

 слепо заменяет любые предшествующие значения для той же переменной. А также, и это, возможно, более важно, строка, переданная, помещается непосредственно в окружение. Это означает, что если ваш код позже изменит эту строку (например, если это был массив, а не строковая константа), окружение также будет изменено. Это, в свою очередь, означает, что вам не следует использовать в качестве параметров для локальную переменную. По всем этим причинам является более предпочтительной функцией.

 

ЗАМЕЧАНИЕ. GNU имеет дополнительную (документированную) особенность в своем поведении. Если строка аргумента является именем без следующего за ним символа, именованная переменная удаляется. Программа GNU, которую мы рассмотрим далее в мой главе, полагается на такое поведение.

 

Функция удаляет переменную из окружения:

 

Наконец, функция полностью очищает окружение:

 

Эта функция не стандартизирована POSIX, хотя она доступна в GNU/Linux и нескольких коммерческих вариантах Unix. Ее следует использовать, если приложение должно быть очень безопасным и нужно построить собственное окружение с нуля. Если недоступна, в справке GNU/Linux для clearenv (3) рекомендуется использовать для выполнения этой задачи ''.

 

Окружение в целом:

 

Правильным способом работы с окружением является использование функций, описанных в предыдущем разделе. Однако, стоит взглянуть на то, как это работает «под капотом».

Внешняя переменная предоставляет доступ таким же способом, как предоставляет доступ к аргументам командной строки. Вы сами должны объявить переменную. Хотя она и стандартизирована POSIX, намеренно не объявлена ни в одном стандартном заголовочном файле (Это, кажется, прослеживается из исторической практики.) Вот объявление:

 

Как и в, завершающим элементом является. Однако, здесь нет переменной «числа строк окружения», которая соответствовала бы. Следующая простая программа распечатывает все окружение:

 

Хотя это и маловероятно, перед попыткой использовать эта программа проверяет, что она не равна.

Переменные хранятся в окружении в случайном порядке. Хотя некоторые оболочки Unix хранят переменные окружения в отсортированном по именам переменных виде, это формально не требуется, и многие оболочки не сортируют их.

В качестве уловки реализации можно получить доступ к окружению, объявив третий параметр:

 

Затем можно использовать также, как. Хотя это иногда можно увидеть в старом коде, мы не рекомендуем такое использование; является официальным, стандартным, переносимым способом получения доступа ко всему окружению, если это вам необходимо.

 

GNU

 

Чтобы завершить главу, рассмотрим GNU версию команды. Эта команда добавляет переменные к окружению в ходе выполнения одной команды. Она может использоваться также для очищения окружения в ходе этой команды или для удаления отдельных переменных окружения. Программа обеспечивает нас двойной функциональностью, поскольку проявляет возможности как, так и несколько других возможностей, обсуждавшихся в этом разделе. Вот как вызывается программа:

 

 

Вот несколько примеров вызовов команды:

env ‑ myprog arg1

env ‑ РАТН =/bin:/usr/bin myprog arg1

env ‑u IFS PATH=/bin:/usr/bin myprog arg1

Код начинается со стандартной формулировки авторских прав GNU и разъясняющего комментария. Мы для краткости их опустили. (Формулировка авторского права обсуждается в Приложении С «Общедоступная лицензия GNU». Показанного ранее вывода достаточно для понимания того, как работает программа.) За объявленным авторским правом и комментарием следуют подключаемые заголовочные файлы и объявления. Вызов макроса '' (строка 93) предназначен для использования при локализации программного обеспечения, тема, освещенная в главе 13 «Интернационализация и локализация». Пока вы можете рассматривать его, как содержащий строковую константу.

 

 

GNU Coreutils содержит большое число программ, многие из которых выполняют одни и те же общие задачи (например, анализ аргументов). Для облегчения сопровождения многие типичные идиомы были определены в виде макросов. Двумя таким макросами являются и (строки 106 и 107). Вскоре мы рассмотрим их определения. Первая функция,, выводит информацию об использовании и завершает программу. Макрос (строка 115, используется также по всей программе) также предназначен для локализации, пока также считайте его содержащим строковую константу.

 

Первая часть объявляет переменные и настраивает локализацию. Функции, и (строки 147–149) обсуждаются в главе 13 «Интернационализация и локализация». Отметим, что эта программа использует аргумент (строка 140). Это единственная программа Coreutils, которая так делает. Наконец, вызов в строке 151 (см. раздел 9.1.5.3. «Функции завершения») регистрирует библиотечную функцию Coreutils, которая очищает все выходные буферы и закрывает, выдавая сообщение при ошибке. Следующая часть программы обрабатывает аргументы командной строки, используя.

 

 

Вот отрывок из файла в дистрибутиве Coreutils с упомянутыми ранее определениями и макросом '', использованным выше (строки 164–165):

 

Результатом этого кода является печать сообщения об использовании утилиты для и печать информации о версии для. Обе опции завершаются успешно («Успешный» и «неудачный» статусы завершения описаны в разделе 9.1.5.1 «Определение статуса завершения процесса».) Поскольку в Coreutils входят десятки утилит, имеет смысл вынести за скобки и стандартизовать как можно больше повторяющегося кода.

Возвращаясь к:

 

 

Строки 174–179 переносят существующие переменные в новую копию окружения. В глобальную переменную помещается указатель на пустой локальный массив. Параметр поддерживает доступ к первоначальному окружению.

Строки 181–184 удаляют переменные окружения, указанные в опции. Программа осуществляет это, повторно сканируя командную строку и удаляя перечисленные там имена. Удаление переменных окружения основывается на обсуждавшейся ранее особенности GNU: при вызове с одним лишь именем переменной (без указанного значения) удаляет ее из окружения.

После опций в командной строке помещаются новые или замещающие переменные окружения. Строки 189–190 продолжают сканирование командной строки, отыскивая установки переменных окружения в виде ' имя значение '.

По достижении строки 192, если в командной строке ничего не осталось, предполагается, что печатает новое окружение и выходит из программы. Она это и делает (строки 195–197).

Если остались аргументы, они представляют имя команды, которую нужно вызвать, и аргументы для передачи этой новой команде. Это делается с помощью системного вызова (строка 200), который замещает текущую программу новой. (Этот вызов обсуждается в разделе 9.1.4 «Запуск новой программы: семейство»; пока не беспокойтесь о деталях.) Если этот вызов возвращается в текущую программу, он потерпел неудачу. В таком случае выводит сообщение об ошибке и завершает программу.

 

 

Значения кода завершения и (определяемые в строке 203) соответствуют стандарту POSIX. означает, что программа, которую попыталась запустить, не существует. (означает, что файл не содержит записи в каталоге.) означает, что файл существует, но была какая‑то другая ошибка.

 

 

Резюме

 

• Программы на С получают аргументы своей командной строки через параметры и. Функция предоставляет стандартный способ для последовательного разбора опций и их аргументов GNU версия предоставляет некоторые расширения, a и дает возможность легкого разбора длинных опций.

• Окружение представляет собой набор пар ' имя значение ', который каждая программа наследует от своего родителя. Программы могут по прихоти своего автора использовать для изменения своего поведения переменные окружения, в дополнение к любым аргументам командной строки. Для получения значений переменных окружения, изменения их значений или удаления существуют стандартные процедуры (,, и). При необходимости можно получить доступ ко всему окружению через внешнюю переменную или через третий аргумент функции. Последний способ не рекомендуется.

 

Упражнения

 

1. Предположим, что программа принимает опции, и, и что требует наличия аргумента. Напишите для этой программы код ручного разбора аргументов без использования или. Для завершения обработки опций принимается. Убедитесь, что ‑ас работает, также, как, и. Протестируйте программу.

2. Реализуйте. Для первой версии вы можете не беспокоиться насчет случая ''. Можете также игнорировать.

3. Добавьте код для '' и к своей версии.

4. Распечатайте и прочтите файлы GNU, и.

5. Напишите программу, которая объявляет как, так и, и сравните их значения.

6. Разбор аргументов командной строки и опций является тем колесом, которое многие люди не могут не изобретать вновь. Вы можете захотеть познакомиться с различными анализирующими аргументы пакетами, помимо и, такими, как:

• библиотека анализа аргументов Plan 9 From Bell Labs arg(2) [31],

• Argp[32],

• Argv[33],

• Autoopts[34],

• GNU Gengetopt[35],

• Opt[36],

• Popt[37]. См. также справочную страницу popt (3) системы GNU/Linux.

7. Дополнительный балл, почему компилятор С не может полностью игнорировать ключевое слово register? Подсказка: какие действия невозможно совершать с регистровой переменной?

 

 

Глава 3


Поделиться с друзьями:

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.023 с.