- •Введение
- •1 Тема 7. Подсистема управления вводом-выводом
- •1.1 Язык С как стандарт взаимодействия с ОС
- •1.2 Системные операции для работы с файловой системой
- •1.2.1 Системные вызовы open() и close()
- •1.2.2 Системные вызовы read() и write()
- •1.2.3 Системный вызов lseek()
- •1.3 Создание специальных файлов
- •1.4 Запрос информации о статусе файлов
- •1.5 Каналы
- •1.5.1 Полудуплексные каналы UNIX
- •1.5.2 Именованные каналы FIFO
- •1.6 Дублирование дескрипторов файлов
- •1.7 Монтирование и демонтирование ФС
- •1.8 Ссылки на имена файлов
- •1.9 Лабораторная работа по теме №7
- •1.9.1 Интегрированная среда разработки Eclipse
- •1.9.2 Список заданий выполняемых работ
- •1.9.3 Проблема типов в языке С
- •1.9.4 Анализ структуры MBR блочных устройств
- •1.9.5 Запрос информации о статусе файлов
- •1.9.6 Неименованные каналы ядра ОС
- •1.9.7 Именованные каналы FIFO
- •1.9.8 Монтирование flashUSB
- •1.9.9 Работа с именами файлов
- •2 Тема 8. Подсистема управления памятью
- •2.1 Классификация способов управления ОЗУ
- •2.2 Программный и аппаратный способы адресации памяти
- •2.3 Страничная и сегментная адресации памяти
- •2.4 Комбинированный способ адресации памяти
- •2.5 Лабораторная работа по теме №8
- •2.5.1 Структура поцесса
- •2.5.2 Определяемые сегменты процесса
- •2.5.3 Создание и удаление процессов из памяти
- •2.5.4 Динамическое выделение и освобождение памяти процесса
- •3 Тема 9. Базовое взаимодействие процессов
- •3.1 Подсистема управления процессами
- •3.2 Синхронизация процессов
- •3.3 Стандарты POSIX
- •3.4 Системные вызовы ОС по управлению процессами
- •3.5 Системный вызов fork() и каналы процесса
- •1.5.1 Пример использования каналов процессов
- •1.5.2 Имитация конвейеров языка shell
- •3.6 Нити (Threads)
- •3.7 Сигналы POSIX
- •3.8 Лабораторная работа по теме №9
- •3.8.1 Системные вызовы общей группы
- •3.8.2 Управление потоками процессов
- •3.8.3 Обработка сигналов ОС
- •4 Тема 10. Асинхронное взаиодействие процессов
- •4.1 Проблемы распределения ресурсов ОС
- •4.2 Системный пакет IPC
- •4.3 Утилиты управления средствами пакета IPC
- •Утилита ipcmk
- •Утилита ipcs
- •Утлита ipcrm
- •4.4 Семафоры
- •4.5 Задача об обедающих философах
- •4.5.1 Описание задачи
- •4.5.2 Выбор стратегии решения
- •4.5.3 Модель философа
- •4.5.4 Программа-монитор
- •4.6 Лабораторная работа по теме №10
- •4.6.1 Синхронизация двух процессов
- •4.6.2 Задача «Обедающие философы»
- •5 Тема 11. Эффективное взаиодействие процессов
- •5.1 Прикладные средства пакета IPC
- •5.2 Разделяемые сегменты памяти
- •5.3 Задача о читателях и писателях
- •5.4 Передача сообщений
- •5.5 Лабораторная работа по теме №11
- •5.5.1 Задачи с разделяемыми сегментами памяти
- •5.5.2 Программы передачи сообщений
- •6 Тема 12. Системная шина D-Bus
- •6.1 Графические среды ОС
- •6.2 Рабочий стол пользователя
- •6.3 Различия графических сред ОС
- •6.4 X-сервер UNIX
- •6.5 Архитектура шины D-Bus
- •6.5.2 Бибиотека libdbus
- •6.5.3 Проекции ПО D-Bus на языки программирования
- •6.6 Лабораторная работа по теме №12
- •6.6.1 Утилита qdbus
- •6.6.2 Взаимодействие через шину с приложением evince
- •Заключение
- •Список использованных источников
203
Рисунок 6.4 — Проверка текущего адреса вывода Х-сервера
Чтобы разрешить Х-серверу подключение программ, используется утилита xhost. Если запустить xhost без параметров, как показано на рисунке 6.5, то мы получим сообщение, что только авторизованный пользователь может быть подключен.
Рисунок 6.5 — Разрешение доступа с хоста cluster.asu.tusur.ru
Если нужно разрешить подключение с компьютера по извесному адресу, например, cluster.asu.tusur.ru, то нужно использовать команду:
sudo xhost +cluster.asu.tusur.ru
где символы '+' и '-' означают разрешение или запрет подключения.
После выполнения этой команды, мы получим сообщение показанное на том же рисунке 6.5, что доступ с хоста cluster.asu.tusur.ru теперь разрешен.
Замечание
Если вы запускаете множество программ, отображаемых на удаленном компьютере, следует значение переменной DISPLAY прописать в файле .bashtc
6.5 Архитектура шины D-Bus
Операционные системы Unix/Linux обладают развитыми средствами IPC низкого уровня: сокеты, каналы, семафоры, сегменты разделяемой памяти, передача сообщений. Эти средства ОС были изучены на предыдущих занятиях.
D-Bus – еще одна система межпроцессного взаимодействия (Interprocess Communication или IPC).
204
Суть проблемы состоит в том, что приложения одного рабочего стола должны тесно взаимодействовать между собой. Для этой цели применялись разные разработки, например, DCOP в KDE или CORBA/Bonobo в GNOME.
Вмарте 2000 года, freedesktop.org - инициативная группа по стандартизации различных графических сред пользователя для операционных систем POSIX, взялась за разработку стандартов (рекомендаций) таких сред.
Вчастности, эта группа определяет такие свойства, как формат ярлыков, взаимо-
действие элементов рабочего стола при перетаскивании его элементов и другие. Требовалось также организовать обмен сообщениями между приложениями двух разных сред.
Более того, freedesktop.org участвует в разработке ПО, например, полностью разрабатывает графическую пользовательскую среду Enlightenment.
Раньше, эта группа называлась «X Desktop Group» и, до сих пор, использует аббревиатуру XDG.
Для решения перечисленных задач и был создан проект D-Bus. Реализация оказалась удачной и было принято решение проект KDE 4 перевести на использование D-Bus. Затем это решение распространилось и на другие проекты.
Таким образом, D-Bus - это система межпроцессного взаимодействия, предоставляющая приложениям несколько шин для передачи сообщений и обеспечивающая беспроблемную связь десктопных приложений. Поддерживается не только широковещательная рассылка сообщений (сигналов), но и удаленный вызов методов.
6.5.1Основные понятия шины D-Bus:
•Системная шина (System bus) — данная шина создается при старте сервера
D-Bus. К ней шине подключены системные сервисы: HAL, NetworkManager, bluez, WPA Supplicant и другие. На этой шине работают сервисы, которые нельзя отнести к какой-то определенной пользовательской сессии, и которые относятся к системе в целом.
•Сессионная шина (Session bus) — данная шина создается на каждый вход
(login) пользователя в систему. К данной шине подключаются приложения авторизованного пользователя и через нее проходит общение программ запущенных в данной рабочей сессии пользователя.
•Имя на шине (Bus name), - каждая программа, подключенная к шине, полу-
чает свое уникальное имя, которое начинается с двоеточия (":") и представлено двумя числами, разделенными точками. Например, «:1.5».
•Имя сервиса (Service name). В D-Bus — приложение может взять несколько
дополнительных имен, чтобы другие программы смогли с ними связываться. Имя сервиса представляет собой набор из символов, разделенных точками ("."). Пример: сервис имеет реальное имя ":1.5", и символьное представление
-"org.freedesktop.NetworkManager". Мы можем подсоединится и к ":1.5" и к "org.freedesktop.NetworkManager" - это один и тот же сервис. Создавать или не создавать такое представление: каждый клиент решает самостоятельно.
•Путь к объекту (Object path) - представляет собой путь к объекту внутри
адресуемого сервиса: "/org/freedesktop/NetworkManager/Device/eth0". Один сервис может обслуживать несколько объектов.
205
•Интерфейс (Interface) — каждый объект предоставляет доступ к некоторому
набору методов и сигналов, который называется интерфейсом. При этом, каждый объект может предоставлять один или множество разных интерфейсов: "org.freedesktop.NetworkManager.Device.Wireless".
•Метод (Method) — некоторое действие, которое может производить объект в
данной программе на данном интерфейсе. Аналогично функциям с языке Си, метод может вернуть: набор некоторых данных, код ошибки, либо может вообще не возвращать данных (void).
•Сигнал (Signal) — некоторое сообщение, которое распространяется среди
всех программ, подписанных на этот сигнал на этом интерфейсе данного объекта данной программы. Сигналы могут содержать набор данных.
•Сообщение (Message) — каждая передача данных на шине представляется в
виде сообщений. Они могут быть 4-х типов: вызовы методов, сигналы, результаты методов, ошибки.
•Прокси-объект (Proxy object) - объект одного из языков программирования:
C++, Python, Java и другие, вызовы методов которого проецируются на вызовы методов D-Bus.
Вобщем случае, взаимодействие между процессами, отображается схемой, показанной на рисунке 6.6. За более подробной информацией, следует обратиться к сайту: http://www.freedesktop.org/wiki/Software/dbus/
Рисунок 6.6 — Диаграмма взаимодействия процессов через шину D-Bus
206
Взаимодействие между приложениями происходит через серверное приложение Bus Daemon Process, которое реализовано в виде программы dbus-daemon.
Процесс взаимодействия обеспечивается специальным механизмом сокетов:
Socket Bidirectional Message Stream.
Точками соединения являются универсальные программные конструкции, которые обозначены как DbusConnectionInstance.
Bus Daemon Process обеспечивает диспетчеризацию именованных сообщений между приложениями, используя системные вызовы, реализованные в библиотеке libdbus.
Взаимодействующие приложения используют всего два типа вызовов: Incoming Call и Outgoing Call.
6.5.2 Бибиотека libdbus
Низкоуровневое взаимодействие приложений через шину D-Bus обеспечивается с помощью библиотеки libdbus.
В настоящее время, проект D-Bus реализован как версия 1.х. Поэтому, для его идентификации используется суффикс -1. Например, для ОС УПК АСУ:
•/etc/dbus-1 — директория с файлами конфигурации D-Bus;
•/lib/libdbus-1.so.3 — ссылка на библиотеку libdbus-1.so.3.4.16
Простейший пример приложений, взаимодействующих с помощью библиотеки libdbus, рассмотрим для случая ПО Skype, показанный на рисунке 6.7:
•запущено приложение Skype, которое регистрируется на шине с дополнительным именем com.Skype.API;
•другое приложение, «Клиент автоматизации Skype», посылает первому сообщение, вызывая его метод Invoke().
Соответственно, на листинге 6.1, показана возможная реализация приложения «Клиент автоматизации Skype».
Замечание
Листинг 6.1 следует рассматривать как исключительно демонстрационный пример, реализация которого, в пределах конкретного дистрибутива, может потребовать значительных изменений.
207
Рисунок 6.7 — Пример взаимодействия ПО Skype
Листринг 6.1 - Текст программы «Клиент автоматизации Skype»
/**
*Простейший пример программы, взаимодействующей через
*библиотеку libdbus с клиентом приложения Skype
*(клиент Skype отсутствует в дистрибутиве УПК АСУ) */
#include <stdio.h> #include <stdlib.h> /**
*Дистрибутив УПК АСУ не содержит dbus.h, поэтому
*данный пример не может быть отлажен и запущен */
#include <dbus/dbus.h>
int main (int argc, char **argv)
{
/** * Основные объекты взаимодействия */
DBusConnection * connection; DBusError error;
DBusMessage *call; DBusMessage *reply; /**
* Передаваемое сообщение */
const char * arg = "PROTOCOL 6\n"; char * response = NULL;