Универсализация имен? Что это? — КиберПедия 

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Универсализация имен? Что это?

2021-01-29 72
Универсализация имен? Что это? 0.00 из 5.00 0 оценок
Заказать работу

В былые времена, около V6 Unix, для осуществления разворачивания символов подстановки оболочка использовала за кулисами отдельную программу. Эта программа называлась, и согласно исходному коду V6[130], имя «glob» было сокращением от «global».

Таким образом глагол «to glob» проник в лексикон Unix со значением «осуществлять разворачивание символов подстановки». Это, в свою очередь, дает нам имена функций и. Так что обычно недооцениваемое чувство юмора, время от времени проглядывающее из руководства Unix, все еще живо, официально сохраненное в стандарте POSIX. (Можете ли вы представить кого‑нибудь в IBM в 70‑х или 80‑х годах XX века, называющего системную процедуру?)

 

 

Разворачивание слов оболочкой: и

 

Многие члены комитета POSIX чувствовали, что делает недостаточно: им нужна была библиотечная процедура, способная делать все, что может делать оболочка разворачивание тильды (''), разворачивание переменных оболочки ('') и подстановку команд (''). Многие другие чувствовали, что не подходила для этой цели. Чтобы «удовлетворить» каждого, POSIX предоставляет две дополнительные функции, которые делают все:

 

 

Эти функции работают сходным с и образом, но со структурой:

 

Члены структуры полностью аналогичны описанным ранее для; мы не будем здесь повторять все описание.

Как и для, поведение управляется несколькими флагами. Флаги перечислены в табл. 12.5.

 

Таблица 12.5. Флаги для

 

 Константа Значение
  Добавить результаты текущего вызова к предыдущим
  Зарезервировать мест в начале
  Запретить подстановку команд
  Повторно использовать память, на которую указывает
  Не молчать при возникновении во время разворачивания ошибок
  Неопределенные переменные оболочки должны вызывать ошибку

Возвращаемое значение равно 0, если все прошло хорошо, или одно из значений из табл. 12.6, если нет.

 

Таблица 12.6. Возвращаемые значения ошибок для

 

 Константа Значение
  Метасимвол (конец строки, '|', &,;, <, >, (,), {, или }) в недопустимом месте
  Переменная не определена при установленном
  Попытка подстановки команды при установленном
  Была проблема с выделением динамической памяти
  Синтаксическая ошибка оболочки.

Мы оставляем вам в качестве упражнения (см. далее) модификацию для использования и. Вот наша версия в действии:

ch12‑wordexp

 

 

ch12‑wordexp 'echo $HOME/*.gz'

 

 

ch12‑wordexp 'echo ~arnold'

 

 

ch12‑wordexp 'echo ~arnold/.p*'

 

 

ch12‑wordexp "echo '~arnold/.p*'"

 

 

Регулярные выражения

 

Регулярные выражения являются способом описания текстовых шаблонов для сопоставления. Если вы вообще сколько‑нибудь использовали GNU/Linux или Unix, вы без сомнения знакомы с регулярными выражениями: они являются фундаментальной частью инструментария программиста Unix. Они неотъемлемы от таких повседневных программ, как,,,, Perl, а также редакторы,,  и Emacs. Если вы вообще не знакомы с регулярными выражениями, мы рекомендуем ознакомиться с некоторыми из книг или URL, указанных в разделе 12.9 «Рекомендуемая литература».

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

 

Чтобы сопоставить регулярное выражение, нужно сначала откомпилировать строчную версию регулярного выражения. Компиляция преобразует регулярное выражение во внутренний формат. Затем откомпилированная форма исполняется для строки для проверки, совпадает ли она с первоначальным регулярным выражением. Функции следующие.

 

Компилирует регулярное выражение во внутреннее представление, сохраняя его в структуре, на которую указывает. контролирует процесс компиляции; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.7

 

 

Выполняет откомпилированное регулярное выражение в в строке контролирует способ выполнения; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.8. Вскоре мы обсудим другие аргументы.

 

 

Преобразует ошибку, возвращенную или, в удобочитаемую строку.

 

Освобождает динамическую память, используемую откомпилированным регулярным выражением в.

Заголовочный файл определяет ряд флагов. Некоторые используются с; другие используются с. Однако, все они начинаются с префикса ''. В табл. 12.7 перечислены флаги для компиляции регулярных выражений с помощью.

 

Таблица 12.7. Флаги для

 

 Константа Значение
  Использовать расширенные регулярные выражения. По умолчанию используются базовые регулярные выражения
  Сопоставление игнорирует регистр символов
  Операторы, заменяющие любой символ, не включают символ конца строки
  Информация о начале и конце вложенною шаблона не требуется (см текст)

Флаги для сопоставления регулярных выражений с помощью приведены в табл. 12.8.

 

Таблица 12.8. Флаги дли

 

 Константа Значение
  Оператор ^ (начало строки) не сопоставляется
  Оператор $ (конец строки) не сопоставляется

Флаги, и взаимодействуют друг с другом. Это немного запутано, поэтому мы будем продвигаться небольшими шажками.

• Когда в не включен, символ конца строки действует в качестве обычного символа. С ним может быть сопоставлен метасимвол '' (любой символ), а также дополненные списки символов (''). При этом не сопоставляется немедленно с началом вставленного символа новой строки, а не сопоставляется немедленно с его концом.

• Когда в установлен, оператор не соответствует началу строки. Это полезно, когда параметр является адресом символа в середине сопоставляемого текста.

• Сходным образом, когда в установлен, оператор не соответствует концу строки.

• Когда в включен, то:

• Символ конца строки не соответствует '' или дополненному списку символов.

• Оператор всегда соответствует положению непосредственно за вставленным символом конца строки независимо от установки.

• Оператор всегда соответствует положению непосредственно перед вставленным символом конца строки независимо от установки.

Когда вы осуществляете построчный ввод/вывод, как в случае с, можно не включать в. Если в буфере несколько строк, и каждую из них нужно рассматривать как отдельную, с сопоставлением и, тогда следует включить.

Структура по большей части непрозрачна. Код уровня пользователя может исследовать лишь один член этой структуры; остальное предназначено для внутреннего использования процедурами регулярных выражений:

 

В структуре есть по крайней мере два члена для использования кодом уровня пользователя:

 

 

Как поле, так и структура предназначены для сопоставления вложенных выражений. Рассмотрим такое регулярное выражение:

 

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

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

 описывает часть строки, соответствующую всему регулярному выражению. Участок от до описывает ту часть, которая соответствует каждому вложенному выражению в скобках. (Таким образом, вложенные выражения нумеруются начиная с 1.) Элементы и не используемых элементов массива установлены в ‑1.

 заполняет не более элементов; поэтому следует убедиться, что имеется по крайней мере на 1 элемент больше, чем в.

Наконец, флаг для означает, что начальная и завершающая информация не нужна. Этот флаг следует использовать, когда эти сведения не нужны; это потенциально может довольно значительно повысить производительность.

Другими словами, если все, что вам нужно знать, это «соответствует ли?», включите. Однако, если нужно также знать, «где находится соответствующий текст?», этот флаг следует опустить.

В заключение, как, так и возвращают 0, если они успешны, или определенный код ошибки, если нет. Коды ошибок перечислены в табл. 12.9.

 

Таблица 12.9. Коды ошибок и

 

 Константа Значение
  Содержимое '' недействительно.
  Регулярное выражение недействительно
  Символу, или не предшествует действительное регулярное выражение.
  Фигурные скобки ('') не сбалансированы
  Квадратные скобки ('') не сбалансированы
  В шаблоне использован недействительный элемент сортировки
  В шаблоне использован недействительный класс символов
  В шаблоне есть завершающий символ
  Группирующие скобки ('' или '') не сбалансированы
  Конечная точка в диапазоне не действительна
  Функции не хватило памяти
  Цифра в ' цифра ' недействительна
  Строка не соответствует шаблону

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

 

Строки 10–15 объявляют глобальные переменные программы. Первый набор (строки 10–13) для опций и сообщений об ошибках. Строка 15 объявляет, в которой хранится откомпилированный шаблон. Строки 17–19 объявляют другие функции программы.

 

В строке 29 устанавливается значение, а строки 30–45 анализируют опции. Строки 47–51 компилируют регулярное выражение, помещая результаты в, увеличивает значение, если была проблема. (Соединение функций посредством глобальной переменной, как здесь, обычно считается плохой манерой. Для небольших программ, подобным этой, это сойдет, но для более крупных программ такое сопряжение может стать проблемой.) Если не было ошибок, строка 51 увеличивает значение так, что оставшиеся аргументы представляют файлы для обработки.

 

Строки 53–69 обрабатывают файлы, отыскивая соответствующие шаблону строки. Строки 53–54 обрабатывают случай, когда файлы не указаны: программа читает со стандартного ввода. В противном случае, строки 57–68 обрабатывают в цикле файлы. Строка 58 обрабатывает особый случай '', обозначающий стандартный ввод, строки 60–62 обрабатывают обычные файлы, а строки 63–67 обрабатывают ошибки.

 

Строки 75–95 определяют функцию. Она сначала устанавливает в, поскольку нам нужно знать лишь «подходит ли строка?», а не «где в строке располагается подходящий текст?»

Строки 84‑85 добавляют дополнительные флаги в соответствии с опциями командной строки. Строка 89 компилирует шаблон, а строки 90–94 сообщают о возникших ошибках

 

 

Строки 97–120 определяют функцию, которая читает файл и выполняет сопоставление с регулярным выражением. Внешний цикл (строки 106–119) читает строки ввода. Для избежания проблем с длиной строки мы используем (см. раздел 3.2.1.9 «Только GLIBC: чтение целых строк: и»). Строка 107 вызывает. Ненулевое возвращаемое значение означает либо неудачное сопоставление, либо какую‑нибудь другую ошибку. Строки 109–115 соответственно проверяют и выводят ошибку лишь тогда, когда возникла какая‑нибудь другая проблема – неудачное сопоставление не является ошибкой

Если возвращаемое значение равно 0, строка совпала с шаблоном и соответственно строка 117 выводит имя файла и совпавшую строку.

 

Функция выводит сообщение об использовании и завершает программу. Она вызывается, когда предоставлены недействительные аргументы или не предоставлен шаблон (строки 38–40 и 44–45).

Вот и все! Скромная, но тем не менее полезная версия в 130 строк кода.

 

12.9. Рекомендуемая литература

 

1. Programming Pearls, 2nd edition, by Jon Louis Bentley Addison‑Wesley, Reading, Massachusetts, USA, 2000. ISBN‑ 0‑201‑65788‑0. См. также веб‑сайт этой книги.[131]

Проектирование программы с операторами проверки является одной из главных тем в этой книге.

2. Building Secure Software How to Avoid Security Problems the Right Way, by John Viega and Gary McGraw Addison‑Wesley, Reading, Massachusetts, USA, 2001. ISBN: 0‑201‑72152‑X.

Состояния гонки являются одной из многих проблем, о которых нужно побеспокоиться при написании безопасного программного обеспечения. Другой проблемой являются случайные числа. Данная книга рассматривает наряду с другими обе эти проблемы (Мы упоминали о ней в предыдущей главе.)

3. The Art of Computer Programming. Volume 2. Seminumerical Algorithms, 3rd edition, by Donald E. Knuth Addison‑Wesley, Reading, Massachusetts, USA, 1998. ISBN‑ 0‑201‑89684‑2.[132] См также веб‑сайт этой книги.[133]

Это классическое справочное руководство по генерации случайных чисел.

4. Random Number Generation and Monte Carlo Methods, 2nd edition, by James E. Gentle Springer‑Verlag, Berlin, Germany. 2003. ISBN: 0‑387‑00178‑6.

Данная книга широко освещает методы генерации и тестирования псевдослучайных чисел. Хотя для неё также требуется математическая и статистическая подготовка, уровень не такой высокий, как в книге Кнута. (Благодарим Nelson H.F. Beebe за указание этой ссылки.)

5. sed & awk, 2nd edition, by Dale Dougherty and Arnold Robbins. O'Reilly and Associates, Sebastopol, California, USA, 1997. ISBN: 1‑56592‑225‑5.

Эта книга осторожно вводит в регулярные выражения и обработку текста, начиная с и продвигаясь к более мощным инструментам и.

6. Mastering Regular Expressions, 2nd edition, by Jeffrey E.F. Friedl. O'Reilly and Associates, Sebastopol, California, USA, 2002.[134] ISBN: 0‑59600‑289‑0.

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

7. Руководство для GNU также объясняет регулярные выражения. На системе GNU/Linux для просмотра локальной копии вы можете использовать ''. Или использовать браузер для прочтения онлайн‑документации проекта GNU для.[135]

 

Резюме

 

• Операторы проверки предоставляют способ сделать утверждения о предполагаемом состоянии программы. Они являются полезным инструментом для проектирования и отладки и обычно должны оставаться в коде изделия. Однако, будьте внимательны, чтобы не перепутать операторы проверки с проверками возможных ошибок времени исполнения.

• Функции XXX являются аналогичными более известным функциям XXX. Самой большой их ценностью является то. что они могут работать с двоичными данными; нулевые байты не отличаются от других байтов. Больше известна против, обрабатывающей перекрывающиеся копии.

• Временные файлы полезны во многих приложениях. Функции API и являются предпочтительными способами создания временных файлов, в то же время позволяя избежать состояния гонки и связанных с ней проблем безопасности. Многие программы для указания местоположения своих временных файлов используют переменную окружения, а если она не определена, приемлемое значение по умолчанию (обычно). Это хорошее соглашение, которое следует принять на вооружение в своих программах.

• Функция посылает вызывающему процессу сигнал. Результатом является завершение процесса и создание дампа ядра, предположительно для отладки.

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

• Случайные числа полезны для множества приложений. Большинство программ используют псевдослучайные числа – последовательности номеров, которые кажутся случайными, но которые могут быть воспроизведены с помощью одного и того же начального значения. и являются первоначальными функциями API, стандартизованными языком С. На многих системах использует низкокачественный алгоритм, и используют лучший алгоритм, включены в стандарт POSIX и являются предпочтительными по сравнению с и. Используйте специальные файлы и, если (а) они доступны и (б) если вам нужны случайные числа высокого качества.

• Три функции API предоставляют все более мощные возможности для развертывания метасимволов (подстановки символов).

• является простейшей, возвращающей true/false, если данная строка соответствует или не соответствует шаблону символов подстановки оболочки.

• просматривает файловую систему, возвращая список путей, которые соответствуют данному шаблону. Когда требуются стандартные возможности, следует использовать эту функцию. Хотя GLIBC версия имеет некоторые расширения, переносимые программы, которым нужны дополнительные возможности, должны вместо этого использовать. (Программы, которые будут работать лишь на системах GNU/Linux, не должны стесняться использовать полную мощь GLIBC.)

• не только делает то, что делает, но также выполняет полное развертывание слов в стиле оболочки, включая развертывание тильды, развертывание переменных оболочки и подстановку команд.

• Функции и обеспечивают доступ к базовым и расширенным регулярным выражениям POSIX. Используя одну из этих функций, можно заставить свою программу вести себя идентично со стандартными утилитами, значительно упрощая использование программы пользователями, знакомыми с GNU/Linux и Unix.

 

Упражнения

 

1. Используйте и для написания простой версии программы, которая сравнивает два файла. Вашей версии не нужно поддерживать какие‑нибудь опции.

2. Используйте макрос и прямое сравнение каждого прочитанного символа для написания другой версии, которая сравнивает два файла. Сравните производительность этой версии с производительностью написанной в предыдущем упражнении.

3. (Средней трудности) Рассмотрите функции и GLIBC. Полезна ли для их реализации? Набросайте с ее использованием возможную реализацию.

4. (Трудное) Найдите исходный код GLIBC версии. Он должен быть на одном из CD‑ROM с исходным кодом в вашем дистрибутиве GNU/Linux, или же вы можете найти его в сети. Исследуйте код и объясните его.

5. Проверьте свою память. Как организует удаление файла, когда закрыт указатель файла?

6. Используя и, а также другие необходимые функции или системные вызовы, напишите свою версию. Протестируйте ее тоже.

7. Опишите преимущества и недостатки использования для имени файла, созданного, непосредственно после возвращения.

8. Напишите свою версию, используя и. Как вы можете обеспечить те же гарантии уникальности, которые обеспечивает?

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

10. (Трудное) Даже с урезанной очисткой при обработке сигнала все еще имеется состояние гонки. Есть небольшое окно между созданием временного файла функцией и возвращением и записью его имени в переменной (для использования функцией обработки сигнала). Если в это окно попадает не перехваченный сигнал, программа завершается и оставляет временный файл. Как вы закроете это окно? (Спасибо Jim Meyering.)

11. Попробуйте откомпилировать и запустить на как можно большем количестве различных систем с использованием как можно большего количества различных компиляторов, к каким у вас есть доступ. Попробуйте компилировать с различными уровнями оптимизации. Какие изменения поведения вы видели (если они были)?

12. Посмотрите файл в дистрибутиве исходного кода V7 Unix. Он содержит реализацию функции, описанную в разделе 10.8.1 «Сигнальные часы:, и». Распечатайте ее и прокомментируйте в стиле наших примеров, чтобы объяснить ее работу.

13. Посмотрите справочную страницу lrand48 (3) на системе GNU/Linux или System V. Выглядит ли этот интерфейс более простым или трудным для использования, чем?

14. Возьмите из раздела 8.4.3 «Перемещение по иерархии:» и добавьте опцию. Файлы, соответствующие паттерну, не должны выводиться.

15. (Трудное) Почему GLIBC нужны указатели на альтернативные версии функций стандартных каталогов и? Не может ли она вызывать их непосредственно?

16. Измените для использования функции. Поэкспериментируйте с ней, проделав несколько дополнительных вещей, которые она предоставляет. Не забудьте взять аргументы командной строки в кавычки, чтобы на самом деле выполнила свою работу!

17. Стандартная выводит имя файла, лишь когда в командной строке указано больше одного файла. Сделайте так, чтобы действовала таким же образом.

18. Посмотрите справочную страницу grep (1). Добавьте к стандартные опции, и.

19. Напишите простую замещающую программу:

шаблон подстановка файлы

Она должна читать текстовые строки из указанных файлов или из стандартного ввода, если они не указаны. Каждая строка должна сравниваться на соответствие шаблону. Если обнаружено соответствие, оно должно замещаться подстановкой.

Если указана опция, замещаться должно не только первое совпадение, но и все остальные совпадения в строке.

 

 

Глава 13


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

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

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

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...



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

0.081 с.