Материал: 6262

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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;

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 не следует рассматривать в терминах ООП, поскольку понятие класса здесь не используется. Тем не менее, все объекты имеют имена и доступны, при условии ограничений доступа из среды приложений ОС.

6.5.3 Проекции ПО 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 без параметров

6.6 Лабораторная работа по теме №12

Ранее было отмечено, что без хорошего знания архитектуры приложений, использовать взаимодействие через шину D-Bus - довольно сложно. Кроме того, многие приложения ОС специализированы для применения в конкретной графической среде и развиваются в рамках отдельных проектов.

Такое положение вещей затрудняет изучение ПО D-Bus, делая все рассматриваемые примеры частными, по отношения к общей концепции взаимодействия процессов в среде ОС.

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

Вданной лабораторной работе, мы ограничимся:

изучением утилиты qdbus, обеспечивающей наиболее удобное исследование шины D-Bus;

исследованием примера взаимодействия с приложением evince, посредством доступа к его методам, доступным через шину D-Bus.

Источник: https://studfile.net/preview/16438530/