D-Bus представляет свой альтернативный способ такого взаимодействия. Сам демон dbus занимается маршрутизацией сообщений, рассылаемый приложениями друг другу. Концепция dbus примерно следующая: существуют
- объекты, которым ставятся в соответствие их пути с целью адресации, например /org/freedesktop/Hal/devices/computer;
- каждый объект имеет один или более интерфейсов, например org.freedesktop.DBus.Introspectable;
- каждый интерфейс содержит набор методов и сигналов, методы можно вызывать как функцию, передавая параметры и получая возвращаемое значение, а на сигналы можно подписываться и получать уведомления в соответсвующий момент.
Каждое подключение к демону имеет свое имя, например org.kde.kopete.
Таким образом приложения, зная друг друга по такому имени, могут работать с объектами друг друга.
Интроспекция
Возникает вопрос, а как нам узнать конкретные пути объектов и имена методов, чтобы можно было сделать что-то действительно полезное? В этом помогает способность объектов смотреть внутрь себя, подобно одноименному методу психологических исследований. Каждый объект, даже если о нем заранее ничего не известно, имеет интерфейс org.freedesktop.DBus.Introspectable в котором есть один вызов Introspect.
Попросим у корневого объекта подключения org.freedesktop.DBus рассказать о себе:
dbus-send --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.Introspectable.Introspect
В ответ возвращается строка, содержащая XML файл с описанием, из которого можно узнать, какие доступны интерфейсы, какие в них есть методы и какие есть дочерние узлы, т.е. объекты типа /Name
Несколько примеров
Узнать имена подключений:
dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply / org.freedesktop.DBus.ListNames
Следует отметить, что существуют системная (--system) и сессионая (--session) шины. Первая из них общая для всех процессов, вторая предназначена для пользовательских процессов и запускается в момент входа в систему (например запуска сессии KDE).
Получить массив, содержащий список контактов запущенного kopete:
dbus-send --dest=org.kde.kopete --type=method_call --print-reply /Kopete org.kde.Kopete.contacts
Сделает погромче музыку:
dbus-send --dest=org.mpris.amarok --type=method_call --print-reply /Player org.freedesktop.MediaPlayer.VolumeSet int32:95
Выключит компьютер (без всяких root'овских прав):
dbus-send --system --dest=org.freedesktop.Hal --type=method_call --print-reply /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
В качестве заключения, d-bus к сожалению умеет хорошо работать лишь в рамках одного компьютера.
Ссылка на сайт: http://dbus.freedesktop.org
Комментариев нет:
Отправить комментарий