【发布时间】:2017-09-21 14:17:01
【问题描述】:
我正在为 Raspberry Pi 编写一个程序,当用户插入 USB 驱动器时需要通知该程序。我正在使用 Qt 的 D-Bus 支持来收听 InterfacesAdded from org.freedesktop.UDisks2,它在我的 x86 Linux 桌面上运行良好。
这是我将 D-Bus 信号设置到班级插槽的代码:
auto bus = QDBusConnection::systemBus();
auto monitor = new UsbMonitor(&app); // my class
if (!bus.connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded",
monitor, SLOT(handleit(QDBusObjectPath, QMap<QString,QVariant>)))) {
qFatal("FATAL Couldn't connect USB monitor to D-Bus signal");
}
它不适用于 Pi。我追查到 udisksd 没有运行这一事实,即使它应该在需要时自动启动。
我猜是因为我启动到控制台(不是 GUI)并且只添加了一个信号处理程序,这还不足以让 D-Bus 自动启动 udisksd。
如果我添加
auto msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
bus.call(msg);
在我致电 bus.connect 之前,一切正常。
有没有更好的方法来确保 udisksd 正在运行?我宁愿更改 Pi 上的配置文件,也不愿为了“唤醒”服务而编写额外的代码。
【问题讨论】: