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