DBus研究笔记(一)

本文介绍了DBus的研究,从dbus_bus_get的复杂初始化到dbus_bus_register的"Hello"方法,再到dbus_connection_send_with_reply的异步通信机制。同时,讨论了DBus在多线程中的线程安全问题,并建议在多线程环境中使用特定的发送消息方式。最后,提到了使用Glib或Python绑定版本的常见实践,以及结合事件循环进一步研究的计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.建立连接
        要使用DBus进行通信必须首先与系统建立连接, 并申请一个"域名"使得其他应用可以找到你。常用DBusConnection* dbus_bus_get(DBusBusType, DBusError*)系列函数来与bus daemon建立连接。DBusBusType为需要连接的总线类型有系统总线,会话总线,和DBUS_BUS_STARTER。系统总线顾名思义在整个系统级别都有效,而会话总线只是相对于当前登录的用户。
        需要说明的问题有两个:第一.dbus_bus_get可以被调用多次当用户,不想使用这个连接的时候需要需要调用dbus_connection_unref解除引用,原因在于,dbus_bus_get这个接口获取的连接不是私有的,不能直接调用dbus_connection_close关闭连接。第二.如果dbus_bus_get获得的是一个新的连接那么dbus_bus_get内部会调用dbus_connection_set_exit_on_disconnection()接口当用户把connection解除引用的时候,应用程序会自动退出。一般我们会在dbus_bus_get之后调用接口撤销该设置。

        其实dbus_bus_get所做的事情远比我们以为的复杂的多,首先做的第一件事情是,初始化bus_connection_addresses这个指针数组,指针指向的是总线地址,主要是通过环境变量来获取三种总线连接的地址,不同系统会有不一样的配置。根据用户指定需要连接的总线类型指定分别建立一张Hash表来管理DBusConnection。第二步:调用dbus_bus_register接口主要做的事情是调用一个系统标准的method叫"Hello"来获取一个unique name。

//建立连接
dbus_error_init(&err);
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
if(!conn && dbus_error_is_set(&err))
{
	printf("Error: %s\n", err.message);
	return (-1);
}
//设置为当收到disconnect信号的时候不退出应用程序(_exit())
dbus_connection_set_exit_on_disconnect(conn, FALSE);


二.注册公共名
      主要用的是dbus_bus_request_name接口,需要注意的是第三个标志位一般设置为DBUS_NAME_FLAG_REPLACE_EXISTING表示当前用户独占该名称,可以用返回值和DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER比较判断是否获取成功。

dbus_bus_request_name里面也用到了标准method:"Reques

<think>嗯,用户想了解如何停止个D-Bus会话总线。首先,我需要回忆下D-Bus的基本知识。D-Bus是种在Linux系统中用于进程间通信的消息总线系统,分为系统总线和会话总线。系统总线是全局的,而会话总线是针对用户会话的。 接下来,用户的问题是关于停止会话总线。通常情况下,会话总线会在用户注销时自动终止,但可能有特殊情况需要手动停止。我需要确认正确的命令和方法。记得D-Bus的守护进程是dbus-daemon,可能需要查找相关的进程ID来终止。 不过,直接终止D-Bus会话总线可能会导致依赖它的应用程序出现问题,比如桌面环境或某些服务崩溃。所以需要提醒用户谨慎操作,并建议在必要时重启会话,比如通过注销或重启系统。 另外,是否有特定的命令可以停止D-Bus?可能需要使用dbus-send发送关闭信号,或者查找进程ID后用kill命令。需要检查这些步骤的正确性,确保命令语法正确,比如使用pkill或killall来终止dbus-daemon进程。 还要考虑用户可能的使用场景,比如调试或解决某些问题,所以提供替代方案,如启动自定义总线,可能会有帮助。同时,确保回答结构清晰,分步骤说明,并强调潜在风险,保证用户理解操作的影响。</think>要停止个D-Bus会话总线,需要分步骤理解其运行机制和操作方式: 、D-Bus会话总线的特性 1. 会话总线默认由用户登录时自动启动(如Linux桌面环境的`dbus-daemon --session`) 2. 通常绑定到用户会话的生命周期,用户注销时自动终止 3. 每个会话总线有独立地址(可通过`$DBUS_SESSION_BUS_ADDRESS`查看) 二、手动停止的两种方式 1. 终止守护进程: ```bash # 查找会话总线进程 pgrep -af dbus-daemon.*--session # 输出示例:1234 /usr/bin/dbus-daemon --session # 发送终止信号 kill -TERM 1234 ``` 2. 通过D-Bus自身接口(需要bus地址): ```bash dbus-send --session --dest=org.freedesktop.DBus \ --type=method_call --print-reply \ /org/freedesktop/DBus \ org.freedesktop.DBus.Shutdown ``` 三、注意事项 1. ⚠️ 强制终止可能导致依赖进程崩溃(如桌面环境、通知服务等) 2. 推荐替代方案: - 正常注销用户会话 - 重启系统 - 启动独立总线用于测试: ```bash export DBUS_SESSION_BUS_ADDRESS=$(dbus-daemon --session --print-address --fork) ``` 四、验证操作 终止后检查状态: ```bash dbus-send --session --dest=org.freedesktop.DBus \ --type=method_call --print-reply \ /org/freedesktop/DBus \ org.freedesktop.DBus.Ping # 预期返回错误 ``` 建议仅在调试或特殊需求时操作,常规使用应保持会话总线正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值