soft_bus (主应用) 和 soft_bus_daemon (守护进程) 是两个独立的进程,它们通过 D-Bus 进行通信,并共享同一个数据库文件。
┌─────────────────────────────────────────────────────────────┐
│ 系统架构 │
└─────────────────────────────────────────────────────────────┘
┌──────────────────────┐ D-Bus ┌──────────────────────┐
│ soft_bus │ ◄─────────────────────► │ soft_bus_daemon │
│ (主应用进程) │ (进程间通信) │ (守护进程) │
│ │ │ │
│ ┌────────────────┐ │ │ ┌────────────────┐ │
│ │ CoreService │ │ │ │ CoreService │ │
│ │ (进程内单例) │ │ │ │ (进程内单例) │ │
│ └────────────────┘ │ │ └────────────────┘ │
│ │ │ │ │ │
│ ▼ │ │ ▼ │
│ ┌────────────────┐ │ │ ┌────────────────┐ │
│ │ DeviceBusCore │ │ │ │ DeviceBusCore │ │
│ │ SoftBusCore │ │ │ │ SoftBusCore │ │
│ └────────────────┘ │ │ └────────────────┘ │
│ │ │ │ │ │
└─────────┼────────────┘ └─────────┼────────────┘
│ │
│ ┌──────────────────┐ │
└─────────────►│ soft_bus_db │◄───────────┘
│ (SQLite数据库) │
└──────────────────┘
(共享数据库文件)
main.cppdaemon_main.cpp每个进程都有自己独立的 CoreService 实例:
// 主应用进程 (main.cpp)
CoreService* coreService = CoreService::instance(); // 进程1的实例
coreService->initialize(); // 初始化进程1的核心
// 守护进程 (daemon_main.cpp)
CoreService* coreService = CoreService::instance(); // 进程2的实例
coreService->initialize(); // 初始化进程2的核心
重要: CoreService::instance() 是进程内单例,不是跨进程单例。两个进程各自有独立的内存空间。
两个进程都使用同一个 SQLite 数据库文件 soft_bus_db:
// 两个进程都调用
m_deviceBusCore->initDB(QStringLiteral("soft_bus_db"));
效果:
主应用通过 DaemonClient 与守护进程通信:
// 主应用 (mainwindow.cpp)
DaemonClient* client = new DaemonClient(this);
client->connectToDaemon(); // 连接到守护进程
client->getStatus(); // 查询守护进程状态
client->getDeviceCount(); // 获取设备数量
守护进程通过 DaemonService 提供 D-Bus 接口:
// 守护进程 (daemon_main.cpp)
DaemonService* service = new DaemonService(coreService, &app);
connection.registerService("com.softbus.Daemon"); // 注册 D-Bus 服务
connection.registerObject("/com/softbus/Daemon", service); // 注册对象
D-Bus 接口:
isRunning() - 检查守护进程是否运行getStatus() - 获取状态信息(JSON)getLoadInfo() - 获取负载信息(CPU、内存、消息速率)getDeviceCount() - 获取设备数量getMessageStats() - 获取消息统计getPid() - 获取进程IDshutdown() - 关闭守护进程soft_bus (进程1)
└─ CoreService (实例1)
└─ DeviceBusCore (实例1)
└─ 连接 soft_bus_db
soft_bus (进程1) soft_bus_daemon (进程2)
└─ CoreService (实例1) └─ CoreService (实例2)
└─ DeviceBusCore (实例1) └─ DeviceBusCore (实例2)
└─ 连接 soft_bus_db └─ 连接 soft_bus_db
▲ │
└────────── 共享数据库 ─────────┘
D-Bus 通信
◄─────────►
soft_bus (已关闭) soft_bus_daemon (进程2,继续运行)
└─ CoreService (实例2)
└─ DeviceBusCore (实例2)
└─ 连接 soft_bus_db
| 特性 | 说明 |
|---|---|
| 进程关系 | 两个独立的进程 |
| 核心实例 | 各自有独立的 CoreService 实例 |
| 数据库 | 共享同一个 SQLite 数据库文件 |
| 通信方式 | 通过 D-Bus 进行进程间通信 |
| 内存状态 | 各自独立,不共享 |
| 数据持久化 | 通过数据库共享 |
简单理解: