dbus как подключиться к демону новой сессии

Насколько я понимаю, пользователь dbus подключается к демону шины сеанса, если среда определяет две переменные, такие как:

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-1cAnv4I,guid=3a453c40b5034f
DBUS_SESSION_BUS_PID=102

Если демон останавливается и мы запускаем новый демон с помощью dbus-launch, мы получим новые значения для среды. В этом случае, как новые значения могут быть переданы в работающий пользовательский процесс без перезапуска?

2 ответа

Решение

Логика повторного подключения к новому демону dbus должна включать несколько компонентов и событий:

  • Монитор шины, который сообщает приложению, работает ли шина, или нет, или перезапущена.

    • При перезапуске шины новый адрес шины будет отправлен в приложение.
  • Приложение, которое отвечает на события down и restart:

    • Если шина не работает или перезапущена, закройте все и вернитесь к началу цикла шины до вызова dbus_bus_get(),
    • Если автобус не работает, дождитесь его перезапуска.
    • Если шина перезапущена, измените переменную среды процесса DBUS_SESSION_BUS_ADDRESS на новый адрес dbus, затем продолжите новый цикл шины, вызвав dbus_bus_get(),

Если вы читаете код в dbus/dbus_bus.c и следуйте за функциями dbus_bus_get() -> internal_bus_get() -> init_connections_unlocked()Вы можете увидеть вышеупомянутую логику, это то, что вы можете сделать. Или вы можете увидеть другие подходы к тому же. Пожалуйста, оставьте комментарий, если вы знаете другие подходы или у вас есть другие мысли.

Изменить: Проверено подход с более подробной информацией:

  • После dbus_bus_get(), вызов dbus_connection_set_exit_on_disconnect(conn,FALSE) чтобы приложение продолжало работать после отключения демона dbus.
  • Добавьте приемник немого сигнала, который вызывает dbus_connection_read_write(conn,0), Если соединение dbus потеряно, возвращается FALSE, Это используется, чтобы решить, когда закрыть цикл dbus. Слить очередь сообщений с dbus_connection_pop_message(conn) несмотря на то, что связь закрыта.
  • Закрыть цикл dbus dbus_connection_unref(conn) затем dbus_shutdown(), Если это не отключение, вызов dbus_bus_get() не будет использовать новую переменную среды.
  • использование setenv(char * name, char * value) установить адрес сеансовой шины.

Один из способов получить адрес после перезапуска - запросить соответствующее свойство X11:

наборы dbus-daemon _DBUS_SESSION_BUS_ADDRESS собственностью _DBUS_SESSION_BUS_SELECTION_[hostname]_[uuid] выбор владельца (uuid является содержимым /var/lib/dbus/machine-id). Это код, который я использую, чтобы прочитать это значение: https://github.com/sidorares/node-dbus/blob/master/lib/address-x11.js

Другие вопросы по тегам