2015-02-03 1 views
1

Я пытаюсь написать программу, которая будет взаимодействовать с VLC через D-Bus.Может ли D-Bus подключиться к определенному PID, когда есть более одного экземпляра программы?

Когда экземпляр VLC работает, я могу выполнить такие вещи, как это в оболочке

qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause 
qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play 

VLC делает паузу и возобновляется, как ожидалось. Отлично.

Что делать, если есть несколько экземпляров VLC, как выбрать, к какому экземпляру отправлена ​​команда? Я знаю его ПИД. Клиент DBus не должен быть qdebus.

ответ

0

нет

каждого d-подключения к шине получает уникальное имя, и вы можете попросить другое имя позже, используя org.freedesktop.DBus.RequestName вызов, но он должен быть уникальными, а также. См. "message bus names" часть спецификации. Обратите внимание, что один процесс может создавать несколько подключений к шине (и, следовательно, имеет несколько связанных с ним имен)

Когда вы выполняете вызов функции d-bus, вы используете имя службы, путь объекта, имя интерфейса и имя метода. Первый используется демоном шины для маршрутизации вашего сообщения, а сам сервис решает, как интерпретировать часть сообщения о пути/интерфейсе/методе/параметрах.

Вы можете получить pid по-другому: хорошо, что клиенты dbus должны поддерживать интерфейс org.freedesktop.DBus, и у вас есть org.freedesktop.DBus.GetConnectionUnixProcessID. Вы можете перебирать все соединения (метод ListNames) и сравнить соединение pid с тем, что у вас есть. Это не гарантирует одно к одному сопоставлению.

Смежные вопросы