А.В. Столяров, И.Г. Головин, И.А. Волкова - Операционная система Unix (1115132), страница 7
Текст из файла (страница 7)
– при вычислении выполняет команду COMMAND.При этом выбранное имя файла подставляется вместо комбинации символов {} Истинность опции определяется успехом (“истина”) или неуспехом (“ложь”) выполнения команды COMMAND.Обычно символ “;”, ограничивающий выполняемую команду, приходится экранировать (то есть ставить перед ним символ \), чтобыинтерпретатор командной строки не принял его за свой спецсимвол. Пример опции -exec разобран выше.Существует большое количество опций команды find, которые, вчастности, позволяют отбирать файлы по временам (создания, модификации и т.п.), правам доступа, владельцам, задавать более тонкие,чем показанные выше, критерии отбора имени файла (регулярные выражения, игнорирование регистра, глубина поиска в поддиректориях,тип файловой системы) и т.д.
и т.п.Выражения (опции) могут комбинироваться с помощью логическихопераций. По умолчанию, в качестве операции берется коньюнкция, т.е.expr1 expr2 означает, что выражение expr2 будет выполняться, толькоесли выражение expr1 истинно. Именно поэтому в команде$ find . -exec grep main {} \; -printопция -print будет вычислена (выполнена) и полное имя файла выведено, только если команда grep нашла в выбранном файле (а выбираютсявсе файлы из текущей директории и её поддиректорий) строку main. Если строка не найдена, то и имя не будет выведено.
В случае, если мы поошибке поместим опцию -print перед опцией -exec, то будут выведеныимена всех файлов, перемежаемые строками, содержащими main.Разумеется, кроме коньюнкции поддерживаются и другие логические операции, а именно отрицание, обозначаемое восклицательнымзнаком, и дизъюнкция, обозначаемая -o. Например, команда$ find /usr/include \! -name "*.h"выведет все имена файлов из /usr/include, не имеющие расширения.h (обратите внимание на пробелы до и после “\!”).36Команда$ find . -name "*.cpp" -o -name "*.c"выведет все имена файлов с расширениями .c и .cpp. Если опуститьоперацию -o, то ни одного имени не будет выведено, поскольку двеопции -name окажутся (по умолчанию) связаны коньюнкцией.Отметим, что логические операции имеют традиционный приоритет,поэтому команда$ find .
-name "*.cpp" -o -name "*.c" -exec grep main {} \; -printвыведет строки, содержащие main, только для файлов с раширением .c(т.к. приоритет коньюнкции выше приоритета дизъюнкции):int main()./kr.cint main()./hel.cЧтобы grep выполнялся для обоих расширений, необходимо условие с-o заключить в круглые скобки, при этом не забыв их заэкранировать,чтобы интерпретатор командной строки не принял их за свои символы.Результирующая команда выглядит страшновато, но делает все, чтонужно (снова обратите внимание на пробелы – они значащие!):$ find . \( -name "*.cpp" -o -name "*.c" \) -exec grep main {} \; -printint main()./kr.cint main()./hel.cint main()./kr.cppВ заключение заметим, что приведенные примеры демонстрируюттолько очень небольшую часть функциональности команды find, но и ихдостаточно, чтобы ощутить мощность и выразительность этой командыи, в общем случае, концепции командной строки Unix.3733.1Графическая оболочка X WindowОсновные понятия X WindowОдним из основных отличий Unix от остальных популярных современных операционных систем является проведение четкого различиямежду тремя фундаментальными понятиями: операционная система, графическая подсистема и графический интерфейс пользователя.Операционная система – это комплекс программ для управления ресурсами компьютера на логическом и физическом уровне.Графическая подсистема (ГП) – это комплекс программ для управления вводом и отображением графической информации.
ГП использует сервисы операционной системы (драйвер клавиатуры, мыши, сетевыесервисы, файловую системуи т.п.), специфические драйверы устройств(графический видеоадаптер, планшет) и предоставляет прикладнымпрограммам интерфейс для работы с графической информацией. ГПв Unix работает под управлением ОС и использует ОС, но не являетсяпри этом частью ОС. Так, нередко компьютеры (например, сервера) подуправлением Unix вообще не содержат ГП. Это существенно упрощаеткак профессиональную работу с ОС, так и разработку прикладных исистемных программ.Интерфейс пользователя (ИП) – это прежде всего набор понятий иправил взаимодействия пользователя-человека с компьютерной системой.
Например, в ИП входят понятия меню, главного окна приложения (содержащего рамку, меню, кнопки управления окном – т.н. элементы оформления окна), командной кнопки, стандарты оформленияменю, окон, кнопок, курсоров (тени, границы, шрифты и др.), правила взаимодействия пользователя с меню и главным окном (как управлять размерами и положением окна, как управлять меню с помощьюклавиатуры и/или мыши) и многие другие вещи.
Если ИП используетграфическую подсистему, то его называют графическим интерфейсомпользователя (ГИП)11 . В ОС Unix есть возможность выбора как между типами ИП (например, можно использовать многооконный интерфейс для алфавитно-цифровых терминалов, основанный на библиотекеcurses12 ), так и между вариациями конкретных ГИП (можно модели11 Соответствующийанглийский термин – Graphical user interface, GUIcurses (современная версия называется ncurses) включает в себя функции управления экраном алфавитно-цифрового терминала, основанныена окнах; реализация функций curses пользуется базой данных об escapeпоследовательностях, поддерживаемых различными типами терминалов, и позволя12 Библиотека38ровать существующие стандарты ГИП, либо создавать свои варианты).Разумеется, кроме понятий и правил в ГИП также входят программыи библиотеки, реализующие эти понятия и правила.Рассмотрим подробнее ГП и ГИП, используемые в настоящее времяв Unix.Установившимся стандартом графической подсистемы для Unix стала так называемая X Window System (далее – X Window).
Основнымипонятиями X Window являются X-сервер, X-протокол и X-клиент.X-сервер – это специальная программа, выполняющая основныефункции ГП. X-сервер отвечает за вывод на графический дисплей текстовых строк, визуализацию базовых графических примитивов (точка, отрезок, дуга, прямоугольник, курсор и т.д.), управление цветом(палитрой) и т.п. Запросы на эту деятельность X-сервер получает отприкладных программ, использующих графическую подсистему. Такиеприкладные программы называются X-клиентами (как и полагаетсясерверу, X-сервер может работать одновременно с несколькими клиентами). Также X-сервер занимается вводом информации от пользователя– через клавиатуру и мышь. Важно понимать, что X-сервер не занимается обработкой и интерпретацией введенной информации; всю этуинформацию он передает X-клиентам, которые и ответственны за этифункции. "Революционность"идеи X Window (эта система начала разрабатываться в 80-ых годах прошлого века) состоит в том, что общение X-клиентов и X-сервера может происходить по сети: в частности, вкачестве транспортного протокола может использоваться TCP/IP, а вкачестве прикладного протокола – так называемый X-протокол, который и описывает взаимодействие прикладных программ (X-клиентов)и X-сервера.
Заметим, что в такой схеме и X-сервер, и X-клиенты могут функционировать как на разных архитектурах компьютеров, таки в различных операционных системах (что и было одной из целейразработчиков X Window System). Можно запустить программу – Xсервер под Unix, MS Windows, Mac OS, VMS и другими операционными системами (реализации X-серверов существуют практически длявсех операционных систем и архитектур) и работать с программами(X-клиентами), работающими на другом компьютере (кстати, не обязательно под управлением Unix).Отметим на всякий случай еще раз, что под X-сервером понимается программа, собственно осуществляющая отображениеграфических объектов на экране, при этом такое отображениеет программам работать одинаково на терминалах разных моделей и с различнымиразмерами экрана39считается услугой, которую оказывает X-сервер прикладнымпрограммам.X-сервер под Unix – это обычный процесс, который, правда, имеетопределенные привилегии для доступа к соответствующему оборудованию (например, памяти видеоадаптера).Далее мы будем рассматривать только X Window для Unix.
В настоящее время наиболее распространенными реализациями являютсясвободно распространяемые XFree86 и X.org.Важным понятием X Window является оконный менеджер (ОМ).Эта программа отвечает за работу с элементами обрамления окна,способами создания, уничтожения, перемещения и изменения размераокон, определяет общий внешний вид дисплея (так называемое корневое окно), специфику работы с мышью и т.д. Оконный менеджер реализует значительную часть функциональности ГИП.
С одной стороны,оконный менеджер – это обычная клиентская программа (X-клиент);с другой стороны, X-сервер особым образом взаимодействует с ним; вчастности, нельзя запустить несколько оконных менеджеров для дисплея – ОМ должен быть единственным. Unix предлагает большой выбороконных менеджеров; к этому вопросу мы вернемся чуть позже.Итак, оконный менеджер берет на себя внешнее оформление и работу с главными окнами приложений, использующих ГИП. Остальнуючасть функциональности ГИП берет на себя клиентское приложение. Xклиенты не реализуют X-протокол непосредственно, используя вместоэтого специальную библиотеку, называемую Xlib, функции из которойи взаимодействуют с X-сервером через сеть.
Xlib – это низкоуровневаябиблиотека, позволяющая использовать все возможности X Window, подобно языку ассемблера, который позволяет непосредственно использовать все возможности архитектуры компьютера. Ценой такой мощностислужит в обоих случаях большая сложность и трудоемкость созданияпрограмм. Существует ряд библиотек, «надстраивающих» Xlib и позволяющих более эффективно и быстро создавать программы с ГИП. Внастоящее время среди программистов, пишущих на C и C++, наиболеепопулярными являются библиотеки GTK+ (ориентированная на оболочку GNOME) и Qt (ориентированная на оболочку GNOME). Однаковозможности X Window можно использовать и на языках, отличных отС/C++, например, Lisp, Ada, Tcl/Tk, Python и др.Одной из самых популярных X-клиентских программ являетсяxterm – эмулятор алфавитно-цифрового дисплея для X Window. В работе может быть удобно завести одновременно несколько экземпляровпроцесса xterm, каждый из которых порождает своё окно, в котором40запускает копию интерпретатора командной строки.