2

据我了解,如果环境定义了两个变量,则 dbus 用户连接到会话总线守护程序,例如:

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

如果守护进程停止并且我们通过 dbus-launch 启动一个新的守护进程,我们将获得环境的新值。在这种情况下,如何在不重新启动的情况下将新值传播到正在运行的用户进程中?

4

2 回答 2

1

重启后获取地址的一种方法是查询对应的 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

于 2014-07-30T05:04:54.220 回答
1

重新连接到新的 dbus 守护程序的逻辑应该涉及一些组件和事件:

  • 一个总线监视器,它告诉应用程序总线是否仍在运行、关闭或重新启动。

    • 当总线重新启动时,新的总线地址将被发送到应用程序。
  • 响应宕机和重启事件的应用程序:

    • 如果总线关闭或重新启动,请关闭所有内容并返回到调用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_connection_unref(conn)到那时关闭dbus循环dbus_shutdown()。如果它没有关闭,则调用dbus_bus_get()将不会使用新的环境变量。
  • 用于setenv(char * name, char * value)设置会话总线地址。
于 2014-08-25T17:52:46.647 回答