Я прохожу курс "Операционная система Unix" и после тестов, вижу в отчете, что этот тест сдало еще 25 человек. Почему так мало, это ведь реально хороший и полезный урок. Здесь естьи теория и практичесские материалы. Сам курс написан хорошо, живым языком. И здесь я получил ответы на вопросы по Linux, которые боялся спросить. Наверное это из-за того, что в названии курса написано не Linux, а Unix и это многих отпугивает. |
Графическая подсистема X11
X-приложения
Программный продукт, использующий X11, называется приложением (application, другое значение – "применение"). Если считать, что сами графические возможности уже реализованы X-сервером и библиотеками, то программа и в самом деле окажется приложением к системе, и вся ее заслуга будет состоять только в том, что она применила эти возможности для решения своей задачи.
DISPLAY
При запуске X-приложение проверяет переменную окружения DISPLAY. В этой переменной указано, к какому именно X-серверу оно обратится с запросами. Формат DISPLAY прост: способ_доступа:номер_сервера.номер_экрана. Под способом доступа может подразумеваться сеть (тогда используется сетевой адрес машины с X-сервером ) или какой-нибудь еще механизм, принятый в конкретной системе. Если не написать ничего, будет выбран способ по умолчанию. Номер сервера нужен для того, чтобы различать X-серверы, запущенные на одном компьютере. В Linux или FreeBSD можно запустить несколько XFree86 и переключаться между ними, как между виртуальными консолями – с помощью Ctrl+Alt+F1, Ctrl+Alt+F2 и т. д. В системе может быть несколько виртуальных серверов (например, sshd). Все они должны иметь разные номера. Наконец, один сервер может работать с несколькими экранами – и физически (есть видеокарты с выходами на несколько мониторов), и виртуально (вот тут уж никаких ограничений нет). Правда, это бывает нечасто, и номер экрана тоже можно не писать.
Чаще всего переменная DISPLAY равна ":0": способ доступа – по умолчанию, нулевой сервер, нулевой экран. Если вы воспользовались ssh -X, то увидите в этой переменной что-нибудь наподобие "myhost.mydomain.net:10.0:" доступ по IP-адресу, десятый сервер на удаленной машине и нулевой экран.
Окновод
Мы уже упоминали, что X-сервер не занимается логикой работы с окнами (за исключением смены фокуса). X-сервер, к которому присоединено ровно два клиента, чьи окна перекрываются, представляет собой душераздирающее зрелище: на черно-белом, в мелкую крапинку, фоне два черно-белых окна друг на друге, и их ни растащить по углам, ни сжать нельзя. X-сервер умеет очень ловко манипулировать окошками, но сам никогда ничего не делает, дожидается команды от пользовательской программы. А какой программе захочется самостоятельно отслеживать перекрытие окон, фокус, заниматься изменением размера, перемещением и тому подобным? Ведь основная задача программы может быть совсем другой...
Ответ очевиден: этим должна заниматься программа, основная задача которой состоит в том, чтобы отслеживать перекрытие, изменять размер, двигать, превращать в иконку и т. д. По совместительству эта же программа будет рисовать при окнах разные украшения: рамочки, заголовки, кнопки и меню управления – словом, делать все, что потребно для организации логики управления окнами. Этот X-клиент называется менеджером окон (window manager) или окноводом.
Окноводом может стать каждый! Правда, для этого нужно многое уметь: кроме перечисленного выше, еще надо обрабатывать практически все события, передаваемые от устройств ввода, и многочисленные "подсказки" от приложений относительно того, какими они хотят видеть собственные окна. Разнообразных менеджеров окон на свете множество: от самых простых (рамочка вокруг окна позволяет двигать его, изменять размер и поднимать из глубины) до весьма изысканных (виртуальные экраны, движущиеся полупрозрачные меню, панели инструментов, причудливой формы украшения на окнах; сами окна ползают по экранам, кувыркаются, растворяются, как утренний туман... чего только не придумают).
Выбор окновода на свой вкус – занятие непростое. Мы советуем просто соблюдать меру, сообразуясь с тем, для чего используется оконная система: обилие декораций отвлекает от работы (а если они вдобавок шевелятся?), а минимализм ее усложняет. Имейте в виду, что чем причудливее и многообразнее возможности окновода, тем труднее будет его полностью настроить именно под себя. Скорее всего, вы просто согласитесь пользоваться уже настроенными – общеупотребительными – возможностями, не доводя их до совершенства. Впрочем, современному человеку, приученному к готовому платью и еде с конвейера, не привыкать...
XTerm
С графикой или без, основным интерфейсом управления UNIX была и остается командная строка. X11, предлагая иной способ взаимодействия с компьютером, не должна лишать пользователя возможности работать с самой системой испытанным и эффективным методом – через терминал.
Задача предоставить пользователю X11 командную строку решается довольно легко. Нужно завести X-приложение, окно которого работает аналогично окну терминала: передает символьную информацию от пользователя системе и обратно. Такое приложение будет задействовать псевдотерминал примерно так же, как это делает утилита screen (см. лекцию 8): обмениваться символами с его pty -стороной, а к другой стороне, ttyp, можно подключить пользовательский командный интерпретатор.
Общее название таких программ – эмулятор терминала для X11, XTerm. Не следует путать программу XTerm (или аналогичные ей konsole, rxvt, gterm и т. п.) со способом организации рабочей станции (так называемый "X-терминал"): термины эти созвучны, но относятся к разным областям знаний. Нередко бывает, что на экране X-терминала (компьютера) есть окно терминала X11 (программы XTerm ). XTerm передает сигналы как настоящий терминал, имеет богатый набор управляющих последовательностей (унаследованный от устройства "DEC VT102/VT220"), а вдобавок позволяет воспользоваться всеми преимуществами графической среды: выбрать шрифт, запомнить текст на экране (и даже тот, что только что исчез с него), поменять заголовок и название иконки и многое другое.
Кстати сказать, возможность копирования текста при помощи мыши – свойство не только XTerm. На самом деле любое окно, зарегистрированное в X11 как текстовое, позволяет отметить (при постоянно нажатой первой кнопке мыши или последовательными нажатиями первой и третьей) часть текста. Выделенный текст можно немедленно вставить в любое окно текстового ввода нажатием второй кнопки. Утилита xcutsel предоставляет возможность работы с буфером обмена (cutbuffer), в котором текст может храниться сколь угодно долго.
Сеанс работы с X11
Для работы в X11 пользователю необходимо запустить сразу несколько приложений. В самом деле, кроме окновода нужен хотя бы один XTerm, а сверх того – разные мелкие программки, вроде индикатора загрузки системы xload или настенных часов xclock. Свойства самого X-сервера задаются утилитой xset (можно поменять курсор, звуковой сигнал, переименовать кнопки мыши). Одним словом, пользователю, как правило, нужен небольшой стартовый сценарий, который запускался бы вместе с X-сервером.
С другой стороны, сервер хорошо бы останавливать, когда он больше не используется. Это, конечно, относится к схеме без xdm: пользователь работает с терминала, потом запускает X-сервер для выполнения графических программ, выполняет их и останавливает сервер, чтобы графическим устройством мог воспользоваться кто-нибудь другой. Стандартный способ аварийного завершения работы XFree86 ( Ctrl+Alt+Backspace ), во-первых, доступен только на XFree86, во-вторых, его можно отключить, а в-третьих, все запущенные приложения получат в этом случае сообщение о "внезапной смерти" сервера и тоже завершатся аварийно.
Если запускать не сам X-сервер, а некоторую оболочку вокруг него, называемую startx, то алгоритм работы будет такой. Сначала запустится X-сервер и сформируется значение переменной окружения DISPLAY. Затем запустится сценарий .xinitrc, находящийся в домашнем каталоге пользователя, а если такого нет – системный стартовый сценарий /usr/X11R6/lib/X11/xinit/xinitrc. Предполагается, что X-сервер будет работать до тех пор, пока выполняется .xinitrc. Когда все команды из .xinitrc отработают, его выполнение завершится, а вместе с ним завершится и работа сервера. Поэтому рекомендуется все X-приложения из .xinitrc, кроме последнего, запускать в фоне, чтобы командный интерпретатор не дожидался окончания их работы. Последней программой в стартовом сценарии может быть XTerm, как это сделано в стандартном xinitrc, или менеджер окон. Для завершения XTerm (а с ним и всего сеанса работы X11) достаточно послать ^D запущенному в нем shell, а окновод обычно имеет какую-нибудь кнопочку или меню Exit. Программа, с завершением которой заканчивается сеанс X11, называется лидером сеанса (session leader).
На самом деле X-сервер необходимо перезапускать и при использовании xdm. Несмотря на то что пользователи взаимодействуют только с X-сервером, не задействуя виртуальные консоли, было бы неудобно и небезопасно сохранять какие бы то ни было настройки, сделанные одним пользователем ко времени работы другого. Самое неприятное – это так называемый "клавиатурный вор" (keyboard grabber), программа, притворяющаяся окноводом, для того лишь, чтобы запоминать все, что пользователь ввел с клавиатуры (злоумышленников интересуют, как правило, пароли). Нарушения принципов безопасности легко избежать, если не использовать xhost (авторизацию на основе адреса) и не доверять X-серверу, запущенному не при вас.