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

C dbus如何重新连接到新的会话总线守护进程,c,daemon,dbus,c-api,C,Daemon,Dbus,C Api,据我所知,如果环境定义了以下两个变量,dbus用户将连接到会话总线守护进程: DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-1cAnv4I,guid=3a453c40b5034f DBUS_SESSION_BUS_PID=102 如果守护进程停止,我们通过dbus启动启动一个新的守护进程,我们将获得环境的新值。在这种情况下,如何在不重新启动的情况下将新值传播到正在运行的用户进程中 重新启动后获取地址的一种方法是查询相应的X11属性: dbus

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

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

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

重新启动后获取地址的一种方法是查询相应的X11属性:


dbus守护程序设置
\u dbus\u SESSION\u BUS\u ADDRESS
选择的
\u dbus\u SESSION\u BUS\u选择的属性[hostname]\uuid]
选择所有者(uuid是
/var/lib/dbus/machine id
的内容)。这是我用来读取This值的代码:

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

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

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

    • 如果总线关闭或重新启动,请在调用
      dbus\u bus\u get()
      之前关闭所有内容并返回到总线周期的开始
    • 如果总线关闭,等待总线重新启动
    • 如果总线重新启动,将进程环境变量
      DBUS\u SESSION\u bus\u ADDRESS
      修改为新的DBUS地址,然后通过调用
      DBUS\u bus\u get()
      继续新的总线周期
如果您阅读
dbus/dbus\u bus.c
中的代码,并遵循函数
dbus\u bus\u get()
->
internal\u bus\u get()
->
init\u connections\u unlocked()
,您可能会看到上面的逻辑就是您所能做的。或者你可能会看到做同样事情的其他方法。如果您知道其他方法或有其他想法,请留下评论

编辑:使用更多详细信息验证方法:

  • dbus\u bus\u get()
    之后,调用
    dbus\u connection\u set\u exit\u on\u disconnect(conn,FALSE)
    ,以便在dbus守护进程断开连接后应用程序将继续运行
  • 添加一个哑信号接收器,用于调用
    dbus\u连接\u读写(conn,0)
    。如果dbus连接丢失,它将返回一个
    FALSE
    。用于决定何时关闭dbus循环。使用
    dbus\u connection\u pop\u message(conn)
    排空消息队列,尽管连接已关闭
  • 通过
    dbus\u连接\u unref(conn)
    关闭dbus循环,然后
    dbus\u关闭()。如果未关闭,则对
    dbus\u bus\u get()
    的调用将不会使用新的环境变量
  • 使用
    setenv(char*name,char*value)
    设置会话总线地址
我没有运行X。我需要一种方法将总线地址更新到正在运行的总线用户进程中,而无需重新启动它。感谢您提供的解决方案,它可能对x用户有用。