C dbus如何重新连接到新的会话总线守护进程
据我所知,如果环境定义了以下两个变量,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_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地址,然后通过调用DBUS\u SESSION\u bus\u ADDRESS
继续新的总线周期李>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守护进程断开连接后应用程序将继续运行李>dbus\u connection\u set\u exit\u on\u disconnect(conn,FALSE)
- 添加一个哑信号接收器,用于调用
。如果dbus连接丢失,它将返回一个dbus\u连接\u读写(conn,0)
。用于决定何时关闭dbus循环。使用FALSE
排空消息队列,尽管连接已关闭李>dbus\u connection\u pop\u message(conn)
- 通过
关闭dbus循环,然后dbus\u连接\u unref(conn)
dbus\u关闭()。如果未关闭,则对
的调用将不会使用新的环境变量李>dbus\u bus\u get()
- 使用
设置会话总线地址李>setenv(char*name,char*value)
- 使用