D-Bus

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
D-Bus
Тип

IPC

Разработчик

FreeDesktop.org

Написана на

C

Операционная система

Кроссплатформенный

Последняя версия

1.8.0[1] (20 января 2014)

Лицензия

GPL или AFL 2.1

Сайт

freedesktop.org/wiki/Software/dbus

D-Bus — система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе общаться друг с другом.

D-Bus является частью проекта freedesktop.org. Она обладает высокой скоростью работы, не зависит от рабочей среды, работает на POSIX-совместимых операционных системах, также существует версия для Windows (пока на стадии разработки). Состоит из двух частей: демона и низкоуровневого API. Существуют высокоуровневые библиотеки для фреймворков Qt, Java, GLib, C#, Python, Ruby и библиотека для C++.

История[править | править вики-текст]

Приложения одной среды рабочего стола должны тесно взаимодействовать между собой. В графической среде KDE для этого не так давно использовался DCOP, но другие настольные среды (например, GNOME) не имели аналогичных систем.

Существовала возможность коммуникации посредством CORBA, SOAP или XML-RPC, но CORBA больше подходит для систем масштаба предприятия, чем для графических сред (KDE и GNOME прошли этап его использования за время своего существования), а SOAP и XML-RPC предназначены для веб-сервисов.

Раньше GNOME использовал Bonobo, основанный на CORBA, но из-за зависимости от GObject, Bonobo не использовался в других рабочих средах, а низкое быстродействие CORBA [источник не указан 536 дней] сказывалось на скорости всей среды.

Требовалось организовать обмен сообщениями между приложениями двух разных сред. Для решения этой задачи и был создан проект D-Bus. Реализация оказалась удачной и впоследствии было решено проект KDE 4 перевести на использование D-Bus.

Принципы работы[править | править вики-текст]

D-Bus предоставляет системе несколько шин:

  1. Системная шина. Создаётся при старте демона D-Bus. С её помощью происходит общение различных демонов, таких как UPower, а также взаимодействие пользовательских приложений с этими демонами.
  2. Сессионная шина. Создаётся для пользователя, авторизировавшегося в системе. Для каждой такой шины запускается отдельная копия демона, посредством неё будут общаться приложения, с которыми работает пользователь.

Каждое сообщение D-Bus, передаваемое по шине, имеет своего отправителя. В случае, если сообщение не является широковещательным сигналом, то оно имеет и получателя. Адреса отправителей и получателей называются путями объектов, поскольку D-Bus предполагает, что каждое приложение состоит из набора объектов, а сообщения пересылаются не между приложениями, а между объектами этих самых приложений.

Каждый объект может поддерживать один или более интерфейсов, которые представлены здесь в виде именованных групп методов и сигналов — аналогично интерфейсам Glib, Qt или Java.

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

Сервисы делают доступной ещё одну функцию — запуск необходимых приложений в случае поступления сообщений для них. Для этого должна быть включена автоактивация, а в конфигурации D-Bus за этим сервисом должно быть закреплено одно приложение.

После подключения к шине приложение должно указать, какие сообщения оно желает получать, путём добавления масок совпадений (matchers). Маски представляют собой наборы правил для сообщений, которые будут доставляться приложению. Фильтрация может основываться на интерфейсах, путях объектов и методах.

Сообщения в D-Bus бывают четырёх видов: вызовы методов, результаты вызовов методов, сигналы (широковещательные сообщения) и ошибки.

В D-Bus у каждого объекта своё, уникальное имя, которое выглядит как путь в файловой системе. Например, объект может быть именован как /org/kde/kspread/sheets/3/cells/4/5. Предпочтительны имена, которые несут какую-либо смысловую нагрузку, тем не менее, разработчики могут выбрать и имя /com/mycompany/c5yo817y0c1y1c5b, если это имеет смысл для их приложения.

Имена объектов находятся в пространствах имён, чтобы обеспечить разграничение разных программных модулей. Пространствам имён обычно даётся префикс, специфичный для разработчика, например /org/kde.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

Источник[править | править вики-текст]

Ссылки[править | править вики-текст]