206
Взаимодействие между приложениями происходит через серверное приложение Bus Daemon Process, которое реализовано в виде программы dbus-daemon.
Процесс взаимодействия обеспечивается специальным механизмом сокетов:
Socket Bidirectional Message Stream.
Точками соединения являются универсальные программные конструкции, которые обозначены как DbusConnectionInstance.
Bus Daemon Process обеспечивает диспетчеризацию именованных сообщений между приложениями, используя системные вызовы, реализованные в библиотеке libdbus.
Взаимодействующие приложения используют всего два типа вызовов: Incoming Call и Outgoing Call.
Низкоуровневое взаимодействие приложений через шину 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;
208
/**
* Проверка наличия ПО D-Bus */
dbus_error_init(&error); /** * Соединение с шиной */
connection = dbus_bus_get(DBUS_BUS_SESSION, &error); if (!connection) {
printf("Ошибка соединения с D-BUS: %s\n", error.message); dbus_error_free(&error);
return 1;
}
/**
* Вызов метода Invoke() */
call = dbus_message_new_method_call("com.Skype.API", "/com/Skype", "com.Skype.API", "Invoke");
/**
* Передача методу Invoke() значения аргумента arg */
dbus_message_append_args (call, DBUS_TYPE_STRING, &arg, DBUS_TYPE_INVALID); /** * Ожидание ответа от шины */
reply = dbus_connection_send_with_reply_and_block (connection, call, 100000, &error); if (!reply) {
printf("Ошибка вызова метода: %s\n", error.message); dbus_error_free(&error);
return 1;
}
/** * Чтение ответа сообщения от шины */
dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &response, DBUS_TYPE_INVALID); if (response != NULL)
printf("Ответ: %s\n", response); /**
* Отключение использованных объектов от шины */
dbus_message_unref(call); dbus_message_unref(reply); dbus_connection_unref(connection); return 0;
}
Замечание
Объекты ПО D-Bus не следует рассматривать в терминах ООП, поскольку понятие класса здесь не используется. Тем не менее, все объекты имеют имена и доступны, при условии ограничений доступа из среды приложений ОС.
Приведенный выше пример использует низкоуровневый доступ к D-Bus через библиотеку libdbus.
Для эффективного использования возможностей шины применяются проекции libdbus, реализованные на различные языки.
209 Широко известны следующие проекции:
•GLib API — библиотеки проекта GNU, которые можно найти по адресу: https://developer.gnome.org/gio/stable/gdbus-convenience.html;
•Python API — который широко используется во всех дистрибутивах Linux: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html;
•Qt API — которая составляет постоянную альтернативу библиотекам Glib API: http://doc.qt.io/qt-5/qtdbus-index.html.
Для доступа к шине D-Bus из языка shell используется набор утилит, которые следует внимательно изучить по руководству man:
dbus-cleanup- - используется для очистки директория от остатков сокетов; sockets
dbus-daemon - является демоном шины сообщений D-BUS;
dbus-launch - используется для запуска dbus-daemon из скрипта командной оболочки. Как правило, вызывается из скриптов, регистрирующих вход пользователей в систему;
dbus-monitor
dbus-send
dbus-uuidgen
libdbus-1.
{so,a}
-используется для мониторинга сообщений, поступающих через шину сообщений D-BUS;
-используется для отправки сообщения в шину сообщений D-BUS;
-используется для создания или чтения универсального уникального идентификатора;
-содержит функции API, используемые демоном сообщений D- BUS. D-BUS является первой библиотекой, в которой предложены средства обмена сообщениями вида 1:1 между двумя любыми приложениями; dbus-daemon является приложением, использую-
щим эту библиотеку для реализации демона шины сообщений;
qdbus |
- коммуникационный интерфейс для основанных на Qt API прило- |
|
жениях. |
В общем случае, для работы с D-Bus необходимо хорошо знать приложение, с которым осуществляется взаимодействие, или написать такое приложение самому.
Для практических целей, очень удобна утилита qdbus, например, запущенная без параметров, она выведет все доступные имена D-Bus, как показано на рисунке 6.8.
210
Рисунок 6.8 — Результат запуска qdbus без параметров
Ранее было отмечено, что без хорошего знания архитектуры приложений, использовать взаимодействие через шину D-Bus - довольно сложно. Кроме того, многие приложения ОС специализированы для применения в конкретной графической среде и развиваются в рамках отдельных проектов.
Такое положение вещей затрудняет изучение ПО D-Bus, делая все рассматриваемые примеры частными, по отношения к общей концепции взаимодействия процессов в среде ОС.
Тем не менее, даже частные примеры демонстрируют возможности и перспективы использования современных тенденций развития ПО ОС.
Вданной лабораторной работе, мы ограничимся:
•изучением утилиты qdbus, обеспечивающей наиболее удобное исследование шины D-Bus;
•исследованием примера взаимодействия с приложением evince, посредством доступа к его методам, доступным через шину D-Bus.