dbus如何重新连接到新的会话总线守护程序

时间:2014-07-29 19:30:57

标签: c daemon dbus c-api

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

重新连接到新的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_connection_unref(conn)然后dbus_shutdown()关闭dbus周期。如果未关闭,则对dbus_bus_get()的调用将不会使用新的环境变量。
  • 使用setenv(char * name, char * value)设置会话总线地址。