D-Bus

Z Wikipedii, wolnej encyklopedii
(Przekierowano z D-BUS)

D-BUS – prosty system komunikacji międzyprocesowej (ang. inter-process communication, IPC) dla aplikacji programowych. Mocno inspirowany poprzez DCOP (zawarty w drugim i trzecim wydaniu KDE), D-Bus został dołączony do KDE 4. Większość POSIXowych systemów operacyjnych wspiera D-bus, istnieje także port dla Windowsa. D-bus jest używany przez Qt 4, a także GNOME, w którym stopniowo zastępował wcześniejszy mechanizm o nazwie Bonobo.

Projekt[edytuj | edytuj kod]

D-bus zezwala programom na rejestrację w celu oferowania usług, oraz pozwala programom klienckim sprawdzać dostępność usług. Program może także zarejestrować się jako oczekujący na zachowania jądra, jak w przypadku sprzętu umożliwiającego hot swapping.

D-bus uruchamia się jako demon (zwykle dbus-daemon). Użytkownicy mogą uruchomić wiele instancji nazywanych kanałami. Większość systemów implementuje uprzywilejowany kanał systemowy z prywatną instancją dla każdego zalogowanego użytkownika. Prywatne instancje są wymagane, ponieważ kanał systemowy posiada ograniczenia dostępu.

Kanał systemowy koncentruje się na dostarczaniu sygnałów od demona HAL (warstwa abstrakcji sprzętowej) do procesów zainteresowanych nimi. Zadaniem prywatnych instancji jest udostępnienie nieograniczonej komunikacji pomiędzy wszystkimi aplikacjami użytkownika.

Architektura[edytuj | edytuj kod]

Architektura D-BUS składa się z kilku warstw:

  • biblioteki libdbus - pozwala połączyć się dwóm aplikacjom i wymieniać między sobą wiadomości.
  • systemu wymiany informacji (ang. message bus daemon) - korzysta on z biblioteki libdbus, dzięki czemu inne aplikacje mogą się z nim połączyć. System ten może przekazywać wiadomości z jednej aplikacji do zera lub więcej innych aplikacji.
  • bibliotek owijających (ang. wrapper libraries) - np. libdbus-glib i libdbus-qt. Istnieją również dowiązania (ang. binding) do wielu różnych języków programowania. Biblioteki te używane są w celu ułatwienia pisania aplikacji korzystających z D-BUS. Biblioteka libdbus została pomyślana jako niskopoziomowy backend wykorzystywany przez wysokopoziomowe dowiązania.

Biblioteka libdbus umożliwia jedynie obsługę połączeń jeden do jednego. Działa podobnie jak gniazdo sieciowe, jednak zamiast przesyłać surowe ciągi bajtów, przesyła wiadomości. Wiadomość zawiera nagłówek identyfikujący wiadomość oraz treść, czyli interesujące nas dane. Biblioteka libdbus ukrywa przed aplikacjami rodzaj wykorzystywanego transportu (gniazda lub cokolwiek innego) oraz takie sprawy jak uwierzytelnianie.

System wymiany informacji (ang. message bus daemon) działa jak hub. Aplikacje wykorzystując bibliotekę libdbus, łączą się do niego na zasadzie jeden do jednego. Jeżeli system ten otrzyma wiadomość od podłączonej aplikacji, to przekazuje ją do innych podłączonych aplikacji.

D-BUS pracuje z dwoma rodzajami bus demonów:

  • system - przeznaczony jest dla wiadomości o charakterze globalnym (np. powiadomienie o podłączeniu nowego urządzenia). Jednocześnie może być uruchomiona tylko jedna instancja tego demona.
  • session - pozwala na komunikację aplikacji uruchomionych w ramach sesji tego samego użytkownika. Dla każdej sesji użytkownika uruchamiana może być nowa instancja tego demona.

Mechanizmy[edytuj | edytuj kod]

Każda aplikacja używająca D-bus zawiera obiekty, które zwykle są mapowane na obiekty typu GObject, QObject, C++/l albo Pythonowe/l. Każdy obiekt D-bus funkcjonuje raczej jako instancja niż jako typ. Wiadomości otrzymane poprzez połączenie D-Busowe są routowane do konkretnego obiektu, nie do całej aplikacji. Pod tym względem D-bus przypomina oprogramowanie komponentowe, gdyż użytkownikowi zdaje się, że wchodzi w interakcję z obiektem niezależnie od tego, czy po drugiej stronie faktycznie znajduje się obiekt.

Żeby umożliwić wiadomościom wskazanie obiektu docelowego, system potrzebuje sposobu, aby odwołać się do obiektu. Wiele języków programowania nazywa to wskaźnikiem lub referencją. Te referencje są jednak implementowane jako adresy pamięci odnoszące się do przestrzeni adresowej aplikacji i nie mogą być przekazywane do innych aplikacji.

D-bus rozwiązuje ten problem, nazywając każdy obiekt. Nazwa wygląda jak ścieżka systemowa (np. /org/kde/kspread/sheets/3/cells/4/5). Nazwy obiektów są trzymane w przestrzeni nazw, tak aby oddzielać odrębne moduły kodu. Przestrzenie nazw są zwykle poprzedzone odwróconą notacją nazwy domeny (np. /org/kde).

Zastosowanie[edytuj | edytuj kod]

D-BUS we współpracy z HAL jest używany przez KDE i GNOME, aby reagować na podłączenie lub odłączenie nowego urządzenia. Coraz więcej aplikacji obsługuje D-BUS, jako przykłady można podać Gajim, Pidgin czy Beagle(inne języki).

Zobacz też[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]